.net core 如何使用xunit和moq传递DbContext对象进行测试
下面提到的是检查特定transactionId是否存在详细信息的测试函数.net core 如何使用xunit和moq传递DbContext对象进行测试,.net-core,moq,xunit.net,.net Core,Moq,Xunit.net,下面提到的是检查特定transactionId是否存在详细信息的测试函数 [Fact] public async Task GetAllBlobDetails_Test() { _serviceScopeFactory.Setup(x => x.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>()).Returns(_context)
[Fact]
public async Task GetAllBlobDetails_Test()
{
_serviceScopeFactory.Setup(x => x.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>()).Returns(_context);
BlobStatusEntity blobStatusEntity = await _bspRepository.GetBlobDetails("123");
Assert.NotNull(blobStatusEntity)
}
我是新来的莫克和许妮特
请帮我解决这个问题
提前感谢所以这里的根本原因是您不能在Moq中模拟扩展方法 你在这里这么做:
_serviceScopeFactory.Setup(x => x.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>()).Returns(_context);
\u serviceScopeFactory.Setup(x=>x.CreateScope().ServiceProvider.GetRequiredService())。返回(\u上下文);
GetRequiredService
是一种扩展方法,它扩展了您可以看到的IServiceProvider
根据您尝试测试的具体情况(您是在测试上下文创建还是实际写入DB?),您应该能够重新编写测试,以避免模拟扩展方法和正在使用的公共实例方法。如果你真的想保留现有的结构,你甚至可以在IServiceProvider上模拟实际的实例方法
关于这一主题还有进一步的讨论。这个问题使用MSTest而不是XUnit,但是您这里的问题是特定于Moq的。所以这里的根本原因是您不能在Moq中模拟扩展方法 你在这里这么做:
_serviceScopeFactory.Setup(x => x.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>()).Returns(_context);
\u serviceScopeFactory.Setup(x=>x.CreateScope().ServiceProvider.GetRequiredService())。返回(\u上下文);
GetRequiredService
是一种扩展方法,它扩展了您可以看到的IServiceProvider
根据您尝试测试的具体情况(您是在测试上下文创建还是实际写入DB?),您应该能够重新编写测试,以避免模拟扩展方法和正在使用的公共实例方法。如果你真的想保留现有的结构,你甚至可以在IServiceProvider上模拟实际的实例方法
关于这一主题还有进一步的讨论。这个问题使用MSTest而不是XUnit,但是您在这里的问题是特定于Moq的。这里是初始化部分
private BspRepository _bspRepository;
private Mock<IServiceScopeFactory> _serviceScopeFactory;
private Mock<ILogger<BspRepository>> _logger;
private Mock<IMapper> _mapper;
private DbContextOptions<MriDbContext> _options;
private MriDbContext _context;
private Mock<IServiceProvider> _serviceProvider;
private Mock<IServiceScope> _serviceScope;
public BSPRepositoryTests()
{
_serviceScopeFactory = new Mock<IServiceScopeFactory>();
_logger = new Mock<ILogger<BspRepository>>();
_mapper = new Mock<IMapper>();
_serviceProvider = new Mock<IServiceProvider>();
_serviceScope = new Mock<IServiceScope>();
_options = SetupDBContext();
_context = new MriDbContext(_options);
_bspRepository = new BspRepository(_serviceScopeFactory.Object, _logger.Object, _mapper.Object);
SetupData();
SetupServices();
}
这里是初始化部分
private BspRepository _bspRepository;
private Mock<IServiceScopeFactory> _serviceScopeFactory;
private Mock<ILogger<BspRepository>> _logger;
private Mock<IMapper> _mapper;
private DbContextOptions<MriDbContext> _options;
private MriDbContext _context;
private Mock<IServiceProvider> _serviceProvider;
private Mock<IServiceScope> _serviceScope;
public BSPRepositoryTests()
{
_serviceScopeFactory = new Mock<IServiceScopeFactory>();
_logger = new Mock<ILogger<BspRepository>>();
_mapper = new Mock<IMapper>();
_serviceProvider = new Mock<IServiceProvider>();
_serviceScope = new Mock<IServiceScope>();
_options = SetupDBContext();
_context = new MriDbContext(_options);
_bspRepository = new BspRepository(_serviceScopeFactory.Object, _logger.Object, _mapper.Object);
SetupData();
SetupServices();
}
在测试代码中,我使用内存中的数据库,并创建了链接到内存中数据库的上下文,而不是使用真实数据库。在测试代码中,我使用内存中数据库,并创建了链接到内存中数据库的上下文,而不是使用真实数据库。
private BspRepository _bspRepository;
private Mock<IServiceScopeFactory> _serviceScopeFactory;
private Mock<ILogger<BspRepository>> _logger;
private Mock<IMapper> _mapper;
private DbContextOptions<MriDbContext> _options;
private MriDbContext _context;
private Mock<IServiceProvider> _serviceProvider;
private Mock<IServiceScope> _serviceScope;
public BSPRepositoryTests()
{
_serviceScopeFactory = new Mock<IServiceScopeFactory>();
_logger = new Mock<ILogger<BspRepository>>();
_mapper = new Mock<IMapper>();
_serviceProvider = new Mock<IServiceProvider>();
_serviceScope = new Mock<IServiceScope>();
_options = SetupDBContext();
_context = new MriDbContext(_options);
_bspRepository = new BspRepository(_serviceScopeFactory.Object, _logger.Object, _mapper.Object);
SetupData();
SetupServices();
}
private void SetupServices()
{
_serviceProvider.Setup(x => x.GetService(typeof(MriDbContext))).Returns(_context);
_serviceScope.Setup(x => x.ServiceProvider).Returns(_serviceProvider.Object);
_serviceScopeFactory.Setup(x => x.CreateScope())
.Returns(_serviceScope.Object);
}