c#中类参数的模拟类

本文关键字:模拟类 参数 | 更新日期: 2023-09-27 18:12:11

我有一个class Client。它的方法如下:

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

我正在使用类进行通信。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 '的异常。日志含义发生NotSupportedExceptionMoq.dll,但未在用户代码中处理

附加信息:在非虚拟的(可重写的)VB)成员:x => x. sendmsg (It.IsAny())

谁能告诉我这个错误,我已经做了。以及如何纠正它。

c#中类参数的模拟类

注释说明了一切——您不能以这种方式进行嘲弄。

你能做的:

1。设置一个(精简)界面,你需要的一切:

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

2。在客户端周围创建一个facade来实现它:

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);
}

对Carsten的回答做了一个小小的调整,这个回答已经非常彻底了。

当您创建自己的类时,扩展Client类并实现接口,像这样:(假设"Client"类不是密封的,在这种情况下这将不起作用)

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

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

理想情况下,如果你使用的是像Unity这样的DI服务,你应该将其配置为在请求IClient的实例时实例化DerivedClient