我无法模拟 ServiceBusReceivedMessage 和 ServiceBusMessageActions

var*_*eep 21 .net c# mocking azureservicebus azure-functions

我们想为服务总线消息触发器编写单元测试。我们正在使用Azure.Messaging.ServiceBus nuget 包

     [FunctionName("serviebustrigger")]
  public async Task Run ([ServiceBusTrigger("xxxxtopic", "xxxxsubscription", Connection = "Abs-Connection", AutoCompleteMessages = false)] ServiceBusReceivedMessage message, ServiceBusMessageActions messageActions)

    {
        _logger.LogInformation($"{nameof(Run)} execution started for MessageId:{{MessageId}}", message.MessageId);
        try
        {
                //some code
             await messageActions.CompleteMessageAsync(message);
        }
        catch (Exception ex)
         {
             await messageActions.DeadLetterMessageAsync(message);
         }
    }
Run Code Online (Sandbox Code Playgroud)

现在我想为上面的代码编写单元测试。但我无法模拟ServiceBusReceivedMessageServiceBusMessageActions ,因为它们具有内部构造函数。有人可以建议我更好的方法来编写单元测试

Jes*_*ire 36

ServiceBusMessageActions最初错过了模拟构造函数的实现存在疏忽。这个问题在扩展包v5.2.0中得到了纠正。

通过该修复,可以使用无参数构造函数来确保其ServiceBusMessageActions可与 Moq 或 FakeItEasy 等模拟框架一起使用。每个公共成员都是virtual或可设置的,并且该类不是密封的。您应该能够使用与其他类型相同的方法进行模拟 - 无论是使用模拟框架还是从类继承并创建您自己的模拟类型 - 并利用模型工厂来模拟行为。

对于ServiceBusReceivedMessage服务操作返回的模型类型和其他模型类型,ServiceBusModelFactory用于创建用于测试目的的实例。