首页 > 解决方案 > 在单元测试中强制 DbContext 在 SaveChanges() 上抛出异常

问题描述

我正在使用带有InMemoryDatabase测试功能的 EF Core 2.2.0。有没有办法让它在调用操作时抛出异常,例如SaveChangesor 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();
        }
    }
}

标签: c#unit-testingentity-framework-coreef-core-2.2

解决方案


您可以使用我的 EntityFrameworkCoreMock 库作为基础,请参阅https://github.com/huysentruitw/entity-framework-core-mock

然后SaveChanges像这样覆盖方法的行为:

dbContextMock.Setup(x => x.SaveChanges()).Callback(() => throw new Exception());

推荐阅读