使用AutoFixture.AutoMoq冻结Mock Azure ServiceBusClient失效问题求助
问题原因与解决方案
问题根源
- 直接用Moq创建
ServiceBusClient的Mock时,Moq通过动态生成继承自ServiceBusClient的代理类实现,会调用该类的受保护无参构造函数,完全不需要连接字符串就能正常生成Mock对象。 - AutoFixture.AutoMoq的默认逻辑是优先尝试调用类的公开构造函数生成实例。而
ServiceBusClient的公开构造必须传入符合格式的Azure Service Bus连接字符串,AutoFixture自动生成的随机字符串不满足要求,因此抛出"连接字符串无法解析;格式错误或不包含已知令牌"的异常。
解决方案
方案一:强制AutoFixture用Mock生成ServiceBusClient
通过自定义规则,告诉AutoFixture当需要ServiceBusClient类型时,直接返回Mock对象,而非实例化真实类:
var fixture = new Fixture(); fixture.Customize(new AutoMoqCustomization()); // 自定义ServiceBusClient的创建逻辑,返回Mock实例 fixture.Customize<ServiceBusClient>(c => c.FromFactory(() => new Mock<ServiceBusClient>().Object)); 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();
方案二:启用AutoMoq的ConfigureMembers选项
启用ConfigureMembers后,AutoFixture会优先使用Mock创建对象,同时自动配置Mock的成员,避免实例化真实类:
var fixture = new Fixture(); // 启用ConfigureMembers,让AutoFixture优先用Mock生成对象 fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true }); 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();
内容的提问来源于stack exchange,提问作者NetFx
相关产品推荐
相关产品推荐

