Заставить DbContext выдать исключение на SaveChanges () в модульном тесте - PullRequest
0 голосов
/ 16 января 2019

Я использую EF Core 2.2.0 с InMemoryDatabase для тестирования.Есть ли способ заставить его вызвать исключение при вызове операции, например, SaveChanges или 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();
        }
    }
}

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете использовать мою библиотеку EntityFrameworkCoreMock в качестве основы, см. https://github.com/huysentruitw/entity-framework-core-mock

, а затем переопределить поведение метода SaveChanges следующим образом:

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