我有一个类客户端。 它有如下方法,
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/