【问题标题】:Moq async DbSet Setup IDbAsyncQueryProviderMoq 异步 DbSet 设置 IDbAsyncQueryProvider
【发布时间】:2020-05-25 22:39:56
【问题描述】:

我有这个起订量设置:

_mockContext.Setup(x => x.CarSections).Returns(new List<CarSection> { _carSection }.ToDbSet());

这基本上将 List 分配给 DbContext.CarSections 的实体。

其中一种方法是异步方法。比如:

public async Task<CarSection> GetSectionAsync(int sectionId)
    {
        return await _context
            .CarSections
            .FirstOrDefaultAsync(s => s.CarSectionId == sectionId && s.StatusCode == 4);
    }

当它通过该方法时,我得到了错误:

IQueryable 的提供程序未实现 IDbAsyncQueryProvider。只有提供者实现 IDbAsyncQueryProvider 可用于实体框架异步 操作。

我相信这是因为 .ToDbSet()。已尝试使用 Task.FromResult(new List&lt;CarSection&gt;{ _carSection },但 .Returns 需要“DbSet”而不是“Task”。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 不知道 ToDbSet 来自哪里,但假设它正在设置一个 Mock,您需要添加 mock.As() 然后在该接口上设置方法。也许这个问题的答案有助于stackoverflow.com/a/43594599/491907

标签: c# unit-testing nunit moq


【解决方案1】:

似乎.ToDbSet() 扩展(此扩展来自哪个包?)没有使用实现IDbAsyncQueryProvider 的提供程序设置IQueryable&lt;T&gt;.Provider 属性。

我该如何解决这个问题?

  • 寻找一个可以为您执行此操作的模拟库。我不久前搬到了 EFCore,所以我不确定 EF 目前的情况如何,可能是Effort

  • 如果您想推出自己的产品,请查看doco from MS,它提供了一个随时可用的复制/粘贴 Moq 实施。涉及到一些脚手架,但 MS 已经为您完成了艰苦的工作。您最终将创建自己的IDbAsyncQueryProvider 实现并将其用作DbSet&lt;T&gt; 的提供者。

【讨论】:

  • 这就是我最后要做的。完美运行,谢谢。
  • 您好,请问您是如何解决这个问题的? @rmed1na
猜你喜欢
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
相关资源
最近更新 更多