c# - c#中类参数的模拟类

标签 c# unit-testing mocking

我有一个类客户端。 它有如下方法,

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

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

我需要为客户端编写一个模拟类来为我的类进行单元测试。 我正在使用 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)
    {

    }

它抛出如下异常,

An exception of type 'System.NotSupportedException' occurred in Moq.dll but was not handled in user code

Additional information: Invalid setup on a non-virtual (overridable in VB) member: x => x.SendMsg(It.IsAny())

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

最佳答案

评论说明了一切 - 你不能以这种方式 mock 。

你可以做什么:

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。在您的代码

中使用接口(interface)而不是Client

抱歉没看到这个

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

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/

相关文章:

c# - 具有一定堆栈大小的进程?

javascript - 单元测试 MVC3 客户端功能

java - 使用 mockito 模拟 AsyncTask 导致 NullPointerException

python - mock.MagicMock(spec=SomeClass) 和 mock.create_autospec(SomeClass) 有什么区别?

c# - asp.net mvc web api 的最终用户风格测试

c# - 使用 NetNamedPipe 的 WCF 多个应用程序

c# - WPF 按钮背景 mouseenter 和离开不按预期工作

python - Pytest monkeypatch 不适用于导入的函数

testing - 我应该使用内存数据库而不是模拟我的存储库吗?

java - 使可靠的 Web 服务变得不可靠,但以可控的方式?