当我使用MockBehavior.Strict创建Mock实例时,我收到错误
Moq.dll中出现“Moq.MockException”类型的异常,但未在用户代码中处理
其他信息:DbContext.Set()调用因模拟行为Strict而失败。
模拟上的所有调用都必须有相应的设置。
但是我已经为每个表做了设置,包括那个:
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);
我怀疑问题可能在于我的Repository Implementation或DbContext Implementation:
public class JournalRepository<DataObject, DataContext> : IRepository<DataObject, DataContext>, IDisposable
where DataObject : class
where DataContext : DbContext
{
#region Propiedades
private readonly DataContext _ctx;
等...
public partial class JournalsDB : DbContext
{
public JournalsDB()
: base("name=JournalsDB")
{
}
public JournalsDB(string connectionName)
: base(connectionName)
{
}
等...
编辑:
没有MockBehaviour.Strict我得到的错误值不能为null。参数名称:查询任何DbSet时的源,但正确填充了DbSet。
答案 0 :(得分:2)
说实话,我真的认为你在这里采取了错误的做法。模拟DbContext
真的很痛苦,因为它是一个非常广泛的界面。这实际上就是试图假设你不拥有的界面。嘲笑别人的界面总是一个麻烦的邀请。在DbContext
的情况下,你真的想要模仿像SaveChanges()
这样的调用的行为。
我会将DbContext
的用法隔离在一个更容易模拟的小得多的界面后面。然后,您将要编写两种类型的测试:
使用新界面进行单元测试。这些测试会更容易编写,因为您不必虚拟DbContext
使用包含真实数据的真实数据库测试实现接口的类。这样,您就可以单独测试数据访问层。
有关更详细的说明,请参阅我在此处写的答案:Effort- FirstOrDefault returns null when Faking Database