我有一个班级客户。
它具有以下方法,

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


我正在使用该类进行交流。客户是第3方库中的类,因此我无法编辑客户类。

我需要为客户端编写一个Mock类,以对我的类进行单元测试。
我正在使用Visual Studio单元测试。 .Net 4.5。
对于模拟,我正在使用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())


任何人都可以打电话给我,我已经做到了。以及如何纠正它。
提前致谢。

最佳答案

评论说明了一切-您不能以此方式嘲笑。

你可以做什么:

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

关于c# - C#中类参数的模拟类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24668568/

10-14 22:52
查看更多