1

当使用Z.EntityFramework.Plus扩展时,我无法找到一种方法来模拟/替换上下文返回的任何加号扩展,而不仅仅是Future(),正在使用。我尝试的所有内容都会在z extensions future库中引发NullReferenceException。单元测试Z实体框架加扩展

库示例:

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,但不知道如何克服这一点。有没有人遇到类似的问题?有谁知道任何解决方案?谢谢。

回答

1

未来功能期待一个真实的ObjectContext。我相信当方法GetDbContext被调用时,当前的情况会失败,因为没有找到上下文。

我不知道解决方法,但可能会添加一个选项,如UseMockContext,它可以解决所有查询而不用批量处理(就好像您未使用“未来”功能一样)。

让我知道如果添加此选项,它可以解决您目前的问题。

如果是这样的话,我建议你在这里创建一个问题:https://github.com/zzzprojects/EntityFramework-Plus/issues

+0

这绝对可以工作,我想。做这样的事情的过程是什么?我会将此问题复制到您提供的链接中。 – TMan

+0

太棒了)我会在周末尝试提出这个要求。 –