c# - 在单元测试中强制 DbContext 在 SaveChanges() 上抛出异常
问题描述
我正在使用带有InMemoryDatabase
测试功能的 EF Core 2.2.0。有没有办法让它在调用操作时抛出异常,例如SaveChanges
or Find
?
我想验证我的业务逻辑是否以特定方式处理异常。我知道我可以将DbContext
所有内容抽象在一起,但是使用 EF Core 和InMemoryDatabase
我希望直接访问 DbContext 而无需任何抽象。
在我的单元测试中,我目前正在创建DbContext
这样的:
var dbOptions = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
var context = new MyContext(dbOptions));
我的逻辑(非常简化):
public MyClass
{
private MyContext _context;
public MyClass(MyContext context)
{
_context = context;
}
public void SomeMethod()
{
try
{
*/ .. Other stuff .. */
var entity = context.Find(id);
entity.SomeProperty = "Foo";
context.SaveChanges();
}
catch(Exception e)
{
// I want to test this code...
Log.Write("Something");
DoSomethingElse();
}
}
}
解决方案
您可以使用我的 EntityFrameworkCoreMock 库作为基础,请参阅https://github.com/huysentruitw/entity-framework-core-mock
然后SaveChanges
像这样覆盖方法的行为:
dbContextMock.Setup(x => x.SaveChanges()).Callback(() => throw new Exception());
推荐阅读
- node.js - 在使用 puppeteer 的电子应用程序中使用 webworker
- python - Pycharm - 进程以退出代码 134 完成(被信号 6 中断:SIGABRT)错误
- azure - 具有不同标题的文件以复制 azure dwh 表中的数据
- ruby-on-rails - 在设计注册表单中使用参数
- php - 如何在 android 中使用 MySql 服务器(在桌面上下载)?
- java - getYesterdayDate_yyyy_MM_dd() 这个方法返回类型为 java.sql.date
- python - 为什么这个 tkinter 登录窗口不起作用?
- sql - 如何使用 sql 选择查询通过动态字段名称更新值
- julia - 使用 Plotly Julia 的下拉选择
- java - 从后台删除应用程序时也没有获取位置更新