【发布时间】:2019-03-19 03:42:32
【问题描述】:
我正在开发一个使用 Entity Framework Core 2.0 的 ASP.Net Core 2.0 API。我正在尝试使用 XUnit 和 Moq 构建单元测试,但在为我的 DbContext 创建接口时遇到了问题,因此我可以在单元测试中模拟它。
目前,我的项目没有为我的上下文使用接口。我将它作为它的实现注入到我的存储库类中。在我的Startup.cs 中,我使用services.AddDbContext 进行设置。
典型存储库类构造函数的示例。
public CompaniesRepository(MyDbContext myDbContext)
{
_myDbContext = myDbContext;
}
Startup.cs 示例
services.AddDbContext<MyDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("MyDbConnectionString"),
sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(5,TimeSpan.FromSeconds(30),sqlTransientErrors);
});
});
而且这个方法一直这样工作得很好。
但是,现在我正在尝试设置单元测试,并且我希望能够模拟我的上下文,因此我需要为其创建一个接口。
所以,我向MyDbContext 添加了一个名为IMyDbContext 的接口,并将以下代码添加到我的Startup.cs,遵循blog post by Jerrie Pelser 中的建议
services.AddScoped<IMyDbContext>(provider => provider.GetService<MyDbContext>());
这似乎有效,除了一个问题。我也在使用 Boris Djurdjevic 的EFCore.BulkExtensions NuGet,因此,我的存储库类出现编译错误,现在在其构造函数中注入了IMyDbContext 接口,说明我的接口不包含BulkInsert 的定义:
错误 CS1929“IMyDbContext”不包含“BulkInsert”的定义,并且最佳扩展方法重载“DbContextBulkExtensions.BulkInsert(DbContext, IList, BulkConfig, Action)”需要“DbContext”类型的接收器
我假设我需要以某种方式将BulkInsert 扩展方法添加到我的IMyDyBontext 接口,但我不确定如何正确执行此操作。如果我只是尝试将方法添加到我的界面,那么我会收到一条错误消息,说它没有在我的MyDbContext 类中实现,当然。
如何在MyDbContext 类中引用BulkInsert 扩展方法?
【问题讨论】:
-
两件事:你不应该测试也不应该模拟 DbContext,而是使用 InMemoryDatabase。第二:存储库模式和 Entity Framework Core 更像是一种反模式。你只是把一切都复杂化了
标签: c# asp.net-core mocking entity-framework-core