繁体   English   中英

使用最小起订量模拟测试 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”function 并测试它是否至少运行一次。 这是我的代码:

            //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。 找不到无参数的构造函数。

为了解决无参数构造函数问题,我尝试给函数 null 值来伪造参数。 但它没有用,现在我真的很想知道为什么以及如何解决这个问题。

我最后想通了......我必须像这样创建 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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM