单元测试Z实体框架加扩展

时间:2017-08-10 21:23:44

标签: c# entity-framework unit-testing nsubstitute entity-framework-plus

当使用Z.EntityFramework.Plus扩展时,我无法找到一种方法来模拟/替换当使用任何加号扩展而不仅仅是Future()时上下文返回的内容。我尝试的所有内容都会在z扩展未来库中抛出NullReferenceException。

存储库示例:

public Task<DocumentDomain> GetDocuments(int id)
{
  var futureQuery1 = _context.ReportTypes.Where(x => x.IsReadOnly).Future();
  var futureQuery2 = _context.Reports.Where(x => x.CreateDate < DateTime.Now.AddDays(-10)).Future();
  var futureQuery3 = _context.Person.DeferredFirstOrDefault(x => x.Id == id).FutureValue();

   return new DocumentDomain(futureQuery1.ToList(), futureQuery2.ToList(), futureQuery3.Value);
}

单元测试存储库:

    [Fact]
    public async Task ShouldGetDocumentsForPerson1()
    {
       _context = Substitute.For<IMyDbContext>();
       _context.ReportTypes = new FakeDbSet();
       _context.ReportTypes.AddRange(GetFakeReportTypes());
       // ...etc..arrange for Reports and Person

       var repo = new DocumentRepository(_context);

       // CRASHES HERE ON futureQuery1 at .Future()
       var domain = await repo.GetDocuments(1); // fake id

       Assert.IsTrue(domain.Documents.Count > 0);
    }

不使用Futures,它运作正常。我试过嘲笑几种不同的方法,但总是出错。大多数情况下,它是一个&#34; oops Z扩展程序遇到错误&#34;例外。

我正在考虑它,因为Z扩展期望一个真正的ObjectContext,但不知道如何克服这个问题。有没有人遇到类似的问题?有谁知道任何解决方案?感谢。

1 个答案:

答案 0 :(得分:1)

未来功能期待真正的ObjectContext。我认为当调用方法GetDbContext时当前场景失败,因为找不到上下文。

我不知道有一种解决方法,但可以添加一个选项,例如UseMockContext,它将解析所有查询而不对其进行批处理(就像你没有使用Future功能一样)。

如果添加此选项,请告知我这可以解决您当前的问题。

如果是这种情况,建议您在此处创建问题:https://github.com/zzzprojects/EntityFramework-Plus/issues

相关问题