我正在为 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背后的团队不会很快实现接口("仅您拥有的模拟类型"(,您可以获得其他好处:
- 您确切地知道应用程序从类型中使用了什么功能
- 您可以在行为发生不希望的变化时进行调整
- 你可以很容易地模拟