繁体   English   中英

Mocking Azure ServiceBusClient 依赖项不适用于 AutoFixture.AutoMoq 冻结

[英]Mocking Azure ServiceBusClient dependency not working with AutoFixture.AutoMoq Freeze

以下 class 依赖于来自 Azure.Messaging.ServiceBus NuGet package 的 ServiceBusClient(用于发送 Azure 服务总线消息):

public class MyService {
    private readonly ServiceBusClient _serviceBusClient;

    public MyService(ServiceBusClient serviceBusClient) {
        _serviceBusClient = serviceBusClient;
    }

    public async Task SendServiceBusMessageAsync() {
        var sender = _serviceBusClient.CreateSender("Topic_Name");
        // Send the message
    }
}

当 mocking 使用 Moq 的 ServiceBusClient 依赖项如下时,它按预期工作,并且对 CreateSender 的调用返回设置中指定的内容:

    var mockServiceBusClient = new Mock<ServiceBusClient>();
    mockServiceBusClient.Setup(s => s.CreateSender(It.IsAny<string>())).Returns(new Mock<ServiceBusSender>().Object);

    var sut = new MyService(MockServiceBusClient.Object);
    await sut.SendServiceBusMessageAsync();

当尝试使用 AutoFixture.AutoMoq 进行相同操作时,如下所示,出现以下错误:AutoFixture.ObjectCreationExceptionWithPath 无法解析连接字符串; 它要么格式不正确,要么不包含众所周知的标记。

    fixture = new Fixture();
    fixture.Customize(new AutoMoqCustomization());

    var mockServiceBusClient = fixture.Freeze<Mock<ServiceBusClient>>();
    mockServiceBusClient.Setup(s => s.CreateSender(It.IsAny<string>())).Returns(new Mock<ServiceBusSender>().Object);

    var sut = fixture.Create<MyService>();
    await sut.SendServiceBusMessageAsync();

有谁知道如何让它与 AutoFixture.AutoMoq 一起使用?

我查看了 ServiceBusClient,发现无参数构造函数受到保护,而公共构造函数采用连接字符串。 我猜 AutoFixture.AutoMoq 使用的是后者,但据我所知,它使用的是 Moq。 为什么直接用最小起订量就可以正常工作?

我想我只是将该方法拉入另一个 class,然后注入并模拟它,但最好理解为什么会发生这种情况。

您可以使用 OmitAutoProperties 构建一个,这样它就不会尝试传递连接字符串:

var mockServiceBusClient = fixture.Build<Mock<ServiceBusClient>>().OmitAutoProperties().Create();
fixture.Inject(mockServiceBusClient);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM