查询模拟实体框架上下文的异常

时间:2016-08-13 01:25:31

标签: entity-framework unit-testing moq xunit.net

当我使用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。

Error consulting the DbSet

1 个答案:

答案 0 :(得分:2)

说实话,我真的认为你在这里采取了错误的做法。模拟DbContext真的很痛苦,因为它是一个非常广泛的界面。这实际上就是试图假设你不拥有的界面。嘲笑别人的界面总是一个麻烦的邀请。在DbContext的情况下,你真的想要模仿像SaveChanges()这样的调用的行为。

我会将DbContext的用法隔离在一个更容易模拟的小得多的界面后面。然后,您将要编写两种类型的测试:

  1. 使用新界面进行单元测试。这些测试会更容易编写,因为您不必虚拟DbContext

  2. 使用包含真实数据的真实数据库测试实现接口的类。这样,您就可以单独测试数据访问层。

  3. 有关更详细的说明,请参阅我在此处写的答案:Effort- FirstOrDefault returns null when Faking Database