Entity framework 查询模拟实体框架上下文时出现异常

Entity framework 查询模拟实体框架上下文时出现异常,entity-framework,unit-testing,moq,xunit.net,Entity Framework,Unit Testing,Moq,Xunit.net,当我用MockBehavior.Strict创建Mock实例时,我得到了错误 Moq.dll中发生“Moq.MockException”类型的异常,但未在用户代码中处理 其他信息:DbContext.Set()调用失败,模拟行为严格 模拟上的所有调用都必须有相应的设置 但是我已经为每个表进行了设置,包括那个表: var mockContext = new Mock<JournalsDB>(MockBehavior.Strict); mockContex

当我用MockBehavior.Strict创建Mock实例时,我得到了错误

Moq.dll中发生“Moq.MockException”类型的异常,但未在用户代码中处理

其他信息:DbContext.Set()调用失败,模拟行为严格

模拟上的所有调用都必须有相应的设置

但是我已经为每个表进行了设置,包括那个表:

        var mockContext = new Mock<JournalsDB>(MockBehavior.Strict);
        mockContext.Setup(m => m.Publications).Returns(mockPublicationSet.Object);
        mockContext.Setup(m => m.Journals).Returns(mockJournalSet.Object);
        mockContext.Setup(m => m.AspNetUsers).Returns(mockUserSet.Object);
        mockContext.Setup(m => m.AspNetRoles).Returns(mockRoleSet.Object);
        mockContext.Setup(m => m.AspNetUserClaims).Returns(mockClaimSet.Object);
        mockContext.Setup(m => m.AspNetUserLogins).Returns(mockLoginSet.Object);
等等

 public partial class JournalsDB : DbContext
 {
    public JournalsDB()
        : base("name=JournalsDB")
    {
    }

    public JournalsDB(string connectionName)
        : base(connectionName)
    {

    }
编辑:

没有MockBehavior.Strict,我得到的错误值不能为null。参数名称:查询任何数据库集时的源,但数据库集已正确填充


老实说,我真的认为你在这里采取了错误的方法。模仿DbContext确实很痛苦,因为这是一个非常广泛的接口。这实际上是一个试图虚构一个你不拥有的接口的例子。嘲笑别人的界面总是招惹麻烦。在
DbContext
的情况下,您还需要模拟调用的行为,如
SaveChanges()

我将把
DbContext
的使用隔离在一个更易于模拟的更小的接口后面。然后,您将要编写两种类型的测试:

  • 使用新接口的任何单元测试。这些测试将更容易编写,因为您不必伪造
    DbContext

  • 使用包含真实数据的真实数据库测试实现接口的类。通过这种方式,您可以单独测试数据访问层


  • 要获得更详细的解释,请参阅我在这里写的答案:

    我有一个不太好的存储库模式实现。现在我正在重写代码,以避免DbContext对象中的依赖关系。谢谢你的帮助。如果您模拟您拥有的接口,那么您可以控制它们是否更改其契约。但是其他人的接口或对象,在API中进行破坏性更改的升级也会破坏您的测试,这些测试有时以微妙和令人沮丧的方式模拟他们的API。我的一般方法一直是将外部服务类包装在我声明并控制接口的类中。换句话说,我试图限制外部依赖的表面积。这几乎为我带来了更稳定的代码基础。
     public partial class JournalsDB : DbContext
     {
        public JournalsDB()
            : base("name=JournalsDB")
        {
        }
    
        public JournalsDB(string connectionName)
            : base(connectionName)
        {
    
        }