【问题标题】:Mock Testing a class in C# with Moq使用 Moq 在 C# 中模拟测试一个类
【发布时间】:2021-01-15 22:11:25
【问题描述】:

我想在 Visual Studio 2019(版本 16.8.4)中使用 Moq 和 Nunit 模拟 C# 中的 GreetingMessageHandler 类

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:无法实例化类的代理:SychroClient.Communications.Server。 找不到无参数构造函数。

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

【问题讨论】:

    标签: c# mocking nunit moq-3


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 2022-10-13
      • 2019-09-27
      • 1970-01-01
      • 2013-07-08
      • 2023-03-29
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多