如何模拟 ModuleClient?

How to Mock ModuleClient?

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

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."        

我收到 "System.NotSupported" exception.Please 建议如何模拟模块客户端。

如评论和 GitHub issue 中所建议,您应该围绕 ModuleClient 实现一个包装器,并将您的测试基于此包装器。 如 GitHub 问题所述,ModuleClient 背后的团队不会很快实现接口 ("Only Mock Types That You Own"),您可以获得其他好处:

  • 您确切地知道您的应用程序使用的类型是什么功能
  • 如果行为发生意外变化,您可以进行调整
  • 你可以轻松模拟