Entity framework 查询模拟实体框架上下文时出现异常
当我用MockBehavior.Strict创建Mock实例时,我得到了错误 Moq.dll中发生“Moq.MockException”类型的异常,但未在用户代码中处理 其他信息:DbContext.Set()调用失败,模拟行为严格 模拟上的所有调用都必须有相应的设置 但是我已经为每个表进行了设置,包括那个表: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
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)
{
}