【问题标题】:Mock Class for class parameter in c#C#中类参数的模拟类
【发布时间】:2014-07-10 04:36:48
【问题描述】:

我有一个班级客户。 方法如下,

public class Client
{
   public Client(string portNum);
   public void Init();
   public void SendMsg(byte[] msg);
   public byte[] Receive();
}

我正在使用课程进行交流。 Client 是 3rd 方库中的类,所以我无法编辑 Client 类。

我需要为 Client 编写一个 Mock 类来为我的类进行单元测试。 我正在使用 Visual Studio 单元测试。 .Net 4.5。 对于 Mock,我使用的是 Moq.dll。 我尝试如下,

        [TestMethod]
        public void TestSend()
        {
            var mockClient = new Mock<Client>();
            mockClient.Setup(x => x.SendMsg(It.IsAny<byte[]>())).Callback<byte[]>((m) => Send(m));
            Assert.IsTrue(isInit);
        }

    private void Send(byte[] msg)
    {

    }

如下抛出异常,

“System.NotSupportedException”类型的异常发生在 Moq.dll 但未在用户代码中处理

附加信息:非虚拟设备上的无效设置(可在 VB) 成员:x => x.SendMsg(It.IsAny())

谁能告诉我错误,我已经做到了。以及如何纠正它。 提前致谢。

【问题讨论】:

  • 我正在使用 dll。 Client 是 dll 中的一个类。

标签: c# unit-testing mocking


【解决方案1】:

评论说明了一切——你不能这样嘲笑。

你可以做什么:

1。设置一个(精益)界面,满足您的所有需求:

public interface IClient
{
   public void Init();
   public void SendMsg(byte[] msg);
   public byte[] Receive();
}

2。在客户端周围做一个外观来实现它:

public class MyClient : IClient
{
   private Client _client;

   /* implement everything in the obvious way by using the private field */
}

3。在你的代码

中使用接口而不是Client

抱歉没有看到任何内容

只需插入 IClient 而不是 Client 并将其注入您的构造函数中。

4。模拟界面

[TestMethod]
public void TestSend()
{
   var mockClient = new Mock<IClient>();
   mockClient.Setup(x => x.SendMsg(It.IsAny<byte[]>())).Callback<byte[]>((m) => Send(m));

   // ....
   Assert.IsTrue(isInit);
}

【讨论】:

    【解决方案2】:

    对卡斯滕的回答稍作调整,已经很彻底了。

    当您创建自己的类时,扩展Client 类并实现接口,如下所示:(假设“客户端”类未密封,在这种情况下,这将不起作用)

    public class DerivedClient : Client, IClient
    {
        public DerivedClient(string portNum)
            : base(portNum) {}
    }
    

    这样,您不必从基础 Client 类中复制所有方法(在这种情况下只有 3 个,但在另一种情况下可能更多),因为它实际上只是传递给基础Client 类中的所有内容。

    理想情况下,如果您使用的是 Unity 等 DI 服务,您可以将其配置为在请求 IClient 的实例时实例化 DerivedClient

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 2017-07-23
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多