使用最小起订量在 C# 中模拟测试 class
Mock Testing a class in C# with Moq
我想在 Visual Studio 2019(版本 16.8.4)
中使用 Moq 和 Nunit 在 C# 中模拟 GreetingMessageHandler class
public class GreetingMessageHandler : AbstractServerMessageHandler
{
public GreetingMessageHandler(AbstractServerMessageHandler next) : base(next)
{
}
public override void InnerHandle(ServerSynchroMessage message)
{
IpInformation clientServerIpInformation = JsonConvert.DeserializeObject<IpInformation>(message.payload.body.ToString());
Collection<IpInformation> servers= message.serverReceiver.GetConnectedServer();
if (!MessageHandlingHelper.ServerExists(servers, clientServerIpInformation)) {
message.serverReceiver.ConnectToPeer(clientServerIpInformation);
}
}
}
而试图解决的测试是测试应该执行 运行 的“InnerHandle”函数,并测试它是否 运行 至少一次。这是我的代码:
//arrange
var moqGreeting = new Mock<GreetingMessageHandler>();
var fakeGreet = new GreetingMessageHandler(null);
moqGreeting.Setup(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()));
// act
fakeGreet.InnerHandle(null);
// assert
moqGreeting.Verify(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()), Times.AtLeastOnce);
我得到的错误信息是这样的:
测试方法 UnitTestProject.UnitTest1.GreetingMessageHandlerRun 抛出异常:
Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化 class 的代理:SychroClient.Communications.Server。
找不到无参数构造函数。
为了解决无参数构造函数问题,我尝试给函数赋空值来伪造参数。但它没有用,现在我真的很想知道为什么以及如何解决这个问题。
最后我弄明白了...我必须在创建它时给Mock一个参数(null)
像这样:
[TestMethod]
public void GreetingMessageHandlerRun()
{
// arrange
var moqGreeting = new Mock<GreetingMessageHandler>(null);
moqGreeting.Setup(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()));
// act
var fakeGreet = moqGreeting.Object;
fakeGreet.InnerHandle(null);
// assert
moqGreeting.Verify(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()), Times.AtLeastOnce);
}
我想在 Visual Studio 2019(版本 16.8.4)
中使用 Moq 和 Nunit 在 C# 中模拟 GreetingMessageHandler classpublic class GreetingMessageHandler : AbstractServerMessageHandler
{
public GreetingMessageHandler(AbstractServerMessageHandler next) : base(next)
{
}
public override void InnerHandle(ServerSynchroMessage message)
{
IpInformation clientServerIpInformation = JsonConvert.DeserializeObject<IpInformation>(message.payload.body.ToString());
Collection<IpInformation> servers= message.serverReceiver.GetConnectedServer();
if (!MessageHandlingHelper.ServerExists(servers, clientServerIpInformation)) {
message.serverReceiver.ConnectToPeer(clientServerIpInformation);
}
}
}
而试图解决的测试是测试应该执行 运行 的“InnerHandle”函数,并测试它是否 运行 至少一次。这是我的代码:
//arrange
var moqGreeting = new Mock<GreetingMessageHandler>();
var fakeGreet = new GreetingMessageHandler(null);
moqGreeting.Setup(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()));
// act
fakeGreet.InnerHandle(null);
// assert
moqGreeting.Verify(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()), Times.AtLeastOnce);
我得到的错误信息是这样的:
测试方法 UnitTestProject.UnitTest1.GreetingMessageHandlerRun 抛出异常: Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化 class 的代理:SychroClient.Communications.Server。 找不到无参数构造函数。
为了解决无参数构造函数问题,我尝试给函数赋空值来伪造参数。但它没有用,现在我真的很想知道为什么以及如何解决这个问题。
最后我弄明白了...我必须在创建它时给Mock一个参数(null) 像这样:
[TestMethod]
public void GreetingMessageHandlerRun()
{
// arrange
var moqGreeting = new Mock<GreetingMessageHandler>(null);
moqGreeting.Setup(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()));
// act
var fakeGreet = moqGreeting.Object;
fakeGreet.InnerHandle(null);
// assert
moqGreeting.Verify(x => x.InnerHandle(It.IsAny<ServerSynchroMessage>()), Times.AtLeastOnce);
}