如何模拟模块客户端?



我正在为 IotEdge 自定义模块编写 xunit 测试,我需要在其中模拟打开与 Edge 运行时连接的ModuleClient.CreateFromEnvironmentAsync()

IoT Edge 模块代码如下所示:

var amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
ITransportSettings[] settings = { amqpSetting };
// Open a connection to the Edge runtime
this.ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
await this.ioTHubModuleClient.OpenAsync();

单元测试代码如下所示:

var amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
ITransportSettings[] settings = { amqpSetting };
var moduleClientMoq = new Mock<ModuleClient>(ModuleClient.CreateFromEnvironmentAsync(settings));  // getting an exception-"System.NotSupportedException: 'Type to mock must be an interface or an abstract or non-sealed class."        

我收到"系统不支持"异常。请建议如何模拟模块客户端。

正如评论和 GitHub 问题中所建议的,您应该围绕 ModuleClient 实现一个包装器,并将测试基于此包装器。 如GitHub问题中所述,ModuleClient背后的团队不会很快实现接口("仅您拥有的模拟类型"(,您可以获得其他好处:

  • 您确切地知道应用程序从类型中使用了什么功能
  • 您可以在行为发生不希望的变化时进行调整
  • 你可以很容易地模拟

最新更新