Easy Mock wrapper for mocking EntityFrameworkCore 5 (EFCore5) DbContext and DbSet in your unit-tests. Integrates with Moq or NSubstitute.
๐ข Are you still stuck on EF Core 3.1? No worries, just visit this repository.
๐ฎ Wait, did you say EF6? You really should get worried! Anyway, visit this repository.
PM> Install-Package EntityFrameworkCoreMock.Moq
PM> Install-Package EntityFrameworkCoreMock.NSubstitute
- In-memory storage of test data
- Querying of in-memory test data (synchronous or asynchronous)
- Tracking of updates, inserts and deletes of in-memory test data
- Emulation of
SaveChanges
andSaveChangesAsync
(only saves tracked changes to the mocked in-memory DbSet when one of these methods are called) - Auto-increment identity columns, annotated by the
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
attribute - Primary key on multiple columns, annotated by the
[Key, Column(Order = X)]
attributes
- Throwing a
DbUpdateException
when inserting 2 or more entities with the same primary key while callingSaveChanges
/SaveChangesAsync
(emulating EF behavior) - Throwing a
DbUpdateConcurrencyException
when removing a model that no longer exists (emulating EF behavior)
For the Moq version, you can use all known Moq features, since both DbSetMock
and DbContextMock
inherit from Mock<DbSet>
and Mock<DbContext>
respectively.
public class User
{
[Key, Column(Order = 0)]
public Guid Id { get; set; }
public string FullName { get; set; }
}
public class TestDbContext : DbContext
{
public TestDbContext(DbContextOptions<TestDbContext> options)
: base(options)
{
}
public virtual DbSet<User> Users { get; set; }
}
public class MyTests
{
[Fact]
public void DbSetTest()
{
var initialEntities = new[]
{
new User { Id = Guid.NewGuid(), FullName = "Eric Cartoon" },
new User { Id = Guid.NewGuid(), FullName = "Billy Jewel" },
};
var dbContextMock = new DbContextMock<TestDbContext>(DummyOptions);
var usersDbSetMock = dbContextMock.CreateDbSetMock(x => x.Users, initialEntities);
// Pass dbContextMock.Object to the class/method you want to test
// Query dbContextMock.Object.Users to see if certain users were added or removed
// or use Mock Verify functionality to verify if certain methods were called: usersDbSetMock.Verify(x => x.Add(...), Times.Once);
}
}
public DbContextOptions<TestDbContext> DummyOptions { get; } = new DbContextOptionsBuilder<TestDbContext>().Options;