强制DbContext在单元测试中对SaveChanges()抛出异常

时间:2019-01-16 09:50:36

标签: c# unit-testing entity-framework-core ef-core-2.2

我正在使用带有InMemoryDatabase的EF Core 2.2.0进行测试。有没有一种方法可以使它在调用诸如SaveChangesFind之类的操作时引发异常?

我想验证我的业务逻辑是否正在以特定方式处理异常。我知道我可以一起抽象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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以将EntityFrameworkCoreMock库用作基础,请参见https://github.com/huysentruitw/entity-framework-core-mock

,然后像这样重写SaveChanges方法的行为:

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