【发布时间】:2018-10-05 02:55:15
【问题描述】:
我正在尝试使用 Moq 和 EF Core 创建一个测试存储库,使用它的异步方法(如 AddAsync 和 SaveChangesAsync),但我没有取得丝毫成功...
我找到了很多博客文章(包括这里的问题),但对我没有任何帮助。
例如,我从字面上复制了这篇文章的代码并尝试实现它的引用:[https://fpnotebook.wordpress.com/2017/05/29/asp-net-core-testing-repositories-and-mocking-ef/] 但问题总是一样的,例如:
消息:Moq.MockException:
预期在模拟上调用一次,但为 0 次:m => m.AddAsync (It.IsAny (),)
未配置任何设置。
SaveChangesAsync 也是如此。
这是我一直在尝试实现的示例代码:
//配置
dbSetMock.Setup(m => m.AddAsync(It.IsAny<T>), It.IsAny<CancellationToken>()))
.Callback ((T model, CancellationToken token) => {queryableList.Concat (new [] {model})}})
.Returns ((T model, CancellationToken token) => Task.FromResult((EntityEntry<T>) null));
// 测试本身
[Fact]
public async void AddAsyncTest ()
{
var mockSet = new Mock <DbSet <Wine >> ();
var mockContext = new Mock <SQLContext> (_ options);
mockContext.Setup (m => m.Set <Wine> ()). Returns (mockSet.Object);
var service = new WineCommandRepository (mockContext.Object);
await service.Insert (new Wine
{
IdWine = 1,
Name = "Wine1"
});
mockContext.Object.SaveChanges ();
mockSet.Verify (m => m.AddAsync (It.IsAny <Wine>),
new CancellationToken ()), Times.Once ());
mockContext.Verify (m => m.SaveChanges (), Times.Once ());
}
我的代码没有什么特别之处,我使用了我一直用于同步存储库的东西,但这种情况对我来说是新的。
有没有人克服了这个问题并有一些例子或建议可以分享?
【问题讨论】:
-
显示被测代码以及如何访问 DbSet
-
避免对 DbContext/DbSet(或其他 EF 类型)使用 Mocks。它可能会导致问题而不是工作。而是使用 InMemory 提供程序或 SQLite 内存数据库进行测试。 docs.microsoft.com/en-us/ef/core/miscellaneous/testing
-
“避免对 DbContext/DbSet(或其他 EF 类型)使用 Mocks。”那你有什么建议呢?
-
我正在使用 InMemory 进行测试
标签: c# mocking .net-core entity-framework-core moq