c#中类参数的模拟类

Ban*_*ram 2 c# unit-testing mocking

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

public class Client
{
   public Client(string portNum);
   public void Init();
   public void SendMsg(byte[] msg);
   public byte[] Receive();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用课堂进行交流.客户端是第三方库中的类,因此我无法编辑类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)
    {

    }
Run Code Online (Sandbox Code Playgroud)

它如下所示抛出异常,

Moq.dll中出现"System.NotSupportedException"类型的异常,但未在用户代码中处理

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

任何人都可以解决这个错误,我已经完成了.以及如何纠正它.提前致谢.

Car*_*ten 6

评论说明了一切 - 你不能以这种方式嘲笑.

你可以做什么:

1.设置一个(精益)界面,满足您的一切需求:

public interface IClient
{
   public void Init();
   public void SendMsg(byte[] msg);
   public byte[] Receive();
}
Run Code Online (Sandbox Code Playgroud)

2.围绕客户做一个门面来实现它:

public class MyClient : IClient
{
   private Client _client;

   /* implement everything in the obvious way by using the private field */
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)