Search code examples
sqliteunit-testingtransactionsentity-framework-corein-memory-database

How to unit-test transactions in Entity Framework Core?


I have a method that does some work in a transaction:

public async Task<int> AddAsync(Item item)
{
    int result;

    using (var transaction = await _context.Database.BeginTransactionAsync())
    {
        _context.Add(item);

        // Save the item so it has an ItemId
        result = await _context.SaveChangesAsync();

        // perform some actions using that new item's ItemId
        _otherRepository.Execute(item.ItemId);

        transaction.Commit();
    }

    return result;
}

I'd like to add unit tests to check that if _context.SaveChangesAsync or _otherRepository.Execute fail then the transaction is rolled back, is that possible?

I can't see a way to do that using InMemory or SQLite?


Solution

  • You could check EF Core logs for a RelationalEventId.RollingbackTransaction event type. I provided full details here:

    How to trace an Entity Framework Core event for integration testing?

    How it could look:

    Assert.True(eventList.Contains((int)RelationalEventId.CommittingTransaction));