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())
注释说明了一切——您不能以这种方式进行嘲弄。
你能做的:
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
。