【问题标题】:using Moq to implement a method that accepts no parameters and returns void使用 Moq 实现不接受参数并返回 void 的方法
【发布时间】:2016-08-23 10:28:25
【问题描述】:

我是 Moq 新手,遇到的问题似乎很简单。

我有两个接口 - IClient 和 IClientFactory,它们的方法如下所示:

public interface IClientFactory 
{
  IClientHandler Get(TcpClient tcpClient);
}

public interface IClient 
{
  void Run();
}

实现的 Run() 方法当前打开一个流并发送/接收消息。 我正在尝试测试我的 Server 类,尤其是 Listen 方法。 如何模拟这个,以便我的 Server 类接受客户端并接收来自它的消息?

这是我的服务器类中的代码:

public void Listen(CancellationToken cancellation)
{
    listener.Start(_maxConnections);
    //.... Accept Tcp Client here ....
    var handler = _handlerFactory.Get(client); <--- GET CLIENT HERE
    //.... Start Communication ....
}

【问题讨论】:

  • 接收消息是什么意思?
  • 您需要做的是使TcpClient 可测试。所以最好的办法是把它包装在一个支持界面的外观中。
  • 最可能的答案是模拟@CallumLinington 所建议的TcpClient。我认为您还需要从服务器类中提供更多代码。当前的 sn-p 是有限的,使问题过于宽泛。

标签: c# moq void


【解决方案1】:
  1. 创建一个模拟 IHandlerClient 来满足您的需求。这完全取决于 Listen 方法将如何处理您未显示的 IHandlerClient

  2. 现在你有了handlerClientMock,设置你的IHandlerFactory模拟,让它的Get方法返回那个模拟。

var mock = new Mock();
mock.Setup(f => f.Get(It.IsAny()))
    .Returns(handlerClientMock.Object);
现在,您可以创建传递 IHandlerFactory 模拟的 Server 对象。

【讨论】:

  • 我确实有一个 IClient 的模拟,但我不确定如何创建一个实现,以便当服务器调用 client.Run() 时,它运行 Run( ) 模拟类中的方法。
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多