1

使用 Z.EntityFramework.Plus 扩展时,我无法找到一种方法来模拟/替换在使用任何 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);
    }

不使用期货它工作正常。我尝试了几种不同的方法,但总是出错。大多数情况下,它是“oops Z 扩展遇到错误”异常。

我在想这是因为 Z 扩展期待一个真正的 ObjectContext 但不确定如何克服这个问题。有没有人遇到过类似的问题?有谁知道任何解决方案?谢谢。

4

1 回答 1

1

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

我不知道有什么解决方法,但可以添加一个选项,这样UseMockContext就可以解决所有查询而不对它们进行批处理(就像您没有使用 Future 功能一样)。

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

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

于 2017-08-11T13:06:04.847 回答