.net core 如何使用xunit和moq传递DbContext对象进行测试

.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)

下面提到的是检查特定transactionId是否存在详细信息的测试函数

        [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);
        }