.net core 为什么在.NETCore中运行Xunit测试时,Mock DbContext以与常规DbContext相同的方式初始化时为空

.net core 为什么在.NETCore中运行Xunit测试时,Mock DbContext以与常规DbContext相同的方式初始化时为空,.net-core,moq,xunit,.net Core,Moq,Xunit,因此,我们有一个对象来跟踪我们的上下文进行测试,我们希望模拟上下文,以便让它抛出一个异常 ContextMock.Setup(x=>x.savechangessync(It.IsAny()).ThrowsAsync(newdbupdateexception()) 这是我们的基本上下文类 public InMemoryZZZContext(string dbName = null) { _dbName = dbName ?? _dbName; var

因此,我们有一个对象来跟踪我们的上下文进行测试,我们希望模拟上下文,以便让它抛出一个异常 ContextMock.Setup(x=>x.savechangessync(It.IsAny()).ThrowsAsync(newdbupdateexception())

这是我们的基本上下文类

    public InMemoryZZZContext(string dbName = null)
    {
        _dbName = dbName ?? _dbName;
        var options = new DbContextOptionsBuilder<DatabaseContext>()
            .UseInMemoryDatabase(databaseName: _dbName)
            .ConfigureWarnings(w => w.Ignore(InMemoryEventId.TransactionIgnoredWarning))
            .Options;
       
        TestContext = new ZZZContext(options, UserClaimsServiceMock.Object);
        TestContextMock = new Mock<ZZZContext>(options, UserClaimsServiceMock.Object);
    }
public inMemoryzzContext(字符串dbName=null)
{
_dbName=dbName???\u dbName;
var options=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:_dbName)
.ConfigureWarnings(w=>w.Ignore(InMemoryEventId.TransactionIgnore侏儒))
.选择;
TestContext=new ZZZContext(选项,UserClaimsServiceMock.Object);
TestContextMock=new Mock(选项,UserClaimsServiceMock.Object);
}
在测试的构造函数中,我们有:

    public ZZZRepositoryTest()
    {
        Context = new InMemoryZZZContext().TestContext;
        ContextMock = new InMemoryZZZContext().TestContextMock;
        RepositoryMockHelper = new RepositoryMockHelper();
        RepositoryUnderTest = new OrderingArgumentListTypeRepository(Context, RepositoryMockHelper.DependenciesMock.Object);
        RepositoryUnderTestMock = new OrderingArgumentListTypeRepository(ContextMock.Object, RepositoryMockHelper.DependenciesMock.Object);
        // We tried the following on a whim, to no effect
        ContextMock.Setup(x => x.Set<OrderingArgumentListType>()).Returns(new Mock<DbSet<OrderingArgumentListType>>().Object);
    }
public ZZZRepositoryTest()
{
Context=新的InMemoryzzContext().TestContext;
ContextMock=新建InMemoryzzContext().TestContextMock;
RepositoryMockHelper=新的RepositoryMockHelper();
RepositoryUnderTest=new OrderingArgumentListTypeRepository(上下文,RepositoryMockHelper.DependenciesMock.Object);
RepositoryUnderTestMock=new OrderingArgumentListTypeRepository(ContextMock.Object,RepositoryMockHelper.DependenciesMock.Object);
//我们一时兴起,尝试了以下方法,但没有效果
ContextMock.Setup(x=>x.Set()).Returns(newmock().Object);
}
当我们进入测试的第一行时,上下文被完全填充,但是ContextMock中的表都没有被填充


关于ContextMock为什么可能为空有什么想法吗?

默认情况下,mock将覆盖任何虚拟成员,除非
CallBase
设置为
true

TestContextMock = new Mock<ZZZContext>(options, UserClaimsServiceMock.Object) {
    CallBase = true
};

因此,对于那些未使用上述设置覆盖的基本成员,上下文应按预期调用这些基本成员。当调用
savechangesync
时,上下文应引发异常。这解决了问题。谢谢!
ContextMock
    .Setup(x => x.SaveChangesAsync(It.IsAny<MyModel>()))
    .ThrowsAsync(new DbUpdateException());