【问题标题】:How do I unit test Service Bus SendAsync method properly?如何正确对 Service Bus SendAsync 方法进行单元测试?
【发布时间】:2022-01-11 07:33:39
【问题描述】:

在运行 Azure 服务总线方法 SendAsync 的单元测试时,我在行 _queueClient.Verify() 上收到以下异常:

预期至少对模拟调用一次,但从未执行过:x => x.SendAsync({MessageId:})

这是我的单元测试:

public CustomerSendMsg(){ } //ctor

public async Task ShouldSendMessage()
{
    var _queueClient = new Mock<IQueueClient>();
    var _sut = new Publisher(_queueClient.Object);

    var customer = new Customer()
    {
        FirstName = "John",
        LastName = "Doe"
    };

    _queueClient.Setup(t => t.SendAsync(It.IsAny<Message>())).Returns(Task.CompletedTask).Verifiable();
    
    await _sut.SendMessageAsync(customer);
    
    var messageBody = JsonSerializer.Serialize(customer);
    var msg = new Message(Encoding.UTF8.GetBytes(messageBody));
    
    _queueClient.Verify(t = > t.SendAsync(msg));
}

这是来自 Publisher 类的 SendMessageAsync 方法:

public async Task SendMessageAsync<T>(T obj)
{
    var messageBody = JsonSerializer.Serialize(obj);
    var msg = new Message(Encoding.UTF8.GetBytes(messageBody));
    await _queueClient.SendAsync(msg);
}

你知道我怎样才能使这个单元测试工作吗?

【问题讨论】:

  • 我认为问题在于 Moq 检查两个变量是否引用相同的对象。但真正的大问题是您只是将代码从被测方法复制到您的断言部分。如果此代码有错误,您将永远找不到它。

标签: c# unit-testing moq azureservicebus


【解决方案1】:

您可以从Message 类中解码body 属性并验证客户对象的属性,而不是创建一个由于引用不同而无法工作的新消息对象。

【讨论】:

    【解决方案2】:

    您可以使用It.Is&lt;T&gt; 验证传递给方法的对象是否具有对象的特定属性,而不是进行对象比较(这是 Moq 正在做的事情)。

    _queueClient.Verify(t = > t.SendAsync(It.Is<byte[]>(x => x.Body == Encoding.UTF8.GetBytes(messageBody)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2011-10-18
      相关资源
      最近更新 更多