我想使用模拟库和.mock 来模拟IServiceCollection检查是否AddSingleton使用特定接口和具体类型进行调用。NsubstitexUnit这是我的单元测试:[Fact] public checkIfServicesAddedTo_DI(){ var iServiceCollectionMock = Substitute.For<IServiceCollection>(); var iConfiguration = Substitute.For<IConfiguration>(); MatchServicesManager servicesManager = new MatchServicesManager(); servicesManager.AddServices(iServiceCollectionMock, iConfiguration); iServiceCollectionMock.Received(1).AddSingleton(typeof(IMatchManager) , typeof(MatchManager));}这是实现:public class MatchServicesManager : IServicesManager{ public void AddServices(IServiceCollection services, IConfiguration configuration) { services.AddSingleton<IMatchManager, MatchManager>(); }}我预计测试会成功,但它失败并出现以下错误:NSubstitute.Exceptions.ReceivedCallsException :预计收到正好 1 个呼叫匹配:Add(ServiceDescriptor) 实际上没有收到匹配的呼叫。收到 1 个不匹配的呼叫(不匹配的参数以“*”字符表示):Add(*ServiceDescriptor *)
1 回答

米脂
TA贡献1836条经验 获得超3个赞
AddSingleton是 上的扩展方法IServiceCollection。这使得模拟或验证变得更加困难。
考虑使用接口的实际实现,然后在执行被测方法后验证预期行为。
例如
public void checkIfServicesAddedTo_DI() {
//Arrange
var services = new ServiceCollection();// Substitute.For<IServiceCollection>();
var configuration = Substitute.For<IConfiguration>();
MatchServicesManager servicesManager = new MatchServicesManager();
//Act
servicesManager.AddServices(services, configuration);
//Assert (using FluentAssertions)
services.Count.Should().Be(1);
services[0].ServiceType.Should().Be(typeof(IMatchManager));
services[0].ImplementationType.Should().Be(typeof(MatchManager));
}
- 1 回答
- 0 关注
- 100 浏览
添加回答
举报
0/150
提交
取消