huysentruitw / entity-framework-core-mock

Easy Mock wrapper for mocking EFCore5 DbContext and DbSet using Moq or NSubstitute

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Question] Mock Database object

tiagodenoronha opened this issue · comments

Is it possible to mock the database object?
Asking because it would be helpful to test all the code inside the if(database.EnsureCreated()).

Test case: Identity_Initialize_DatabaseExists, here

Hi @tiagodenoronha, thank you for your patience.

The Database property can be mocked with default Moq syntax.

F.e.:

var databaseMock = new Mock<DatabaseFacade>();
databaseMock.Setup(x => x.EnsureCreated()).Returns(true);

var dbSetMock = new DbContextMock<TestDbContext>(DummyOptions);
dbSetMock.SetupGet(x => x.Database).Returns(databaseMock.Object);

Let me know if you have any further questions.

Hi @tiagodenoronha, thank you for your patience.

The Database property can be mocked with default Moq syntax.

F.e.:

var databaseMock = new Mock<DatabaseFacade>();
databaseMock.Setup(x => x.EnsureCreated()).Returns(true);

var dbSetMock = new DbContextMock<TestDbContext>(DummyOptions);
dbSetMock.SetupGet(x => x.Database).Returns(databaseMock.Object);

Let me know if you have any further questions.

Does this still work in Dotnet Core 5? I am getting

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException: 'Can not instantiate proxy of class: Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.
Could not find a parameterless constructor.'

on that last line in your code snippet.

@cdonner

DatabaseFacade requires a DbContext, so you can give it one:

var contextMock = new Mock<DbContext>();
var databaseFacadeMock = new Mock<DatabaseFacade>(contextMock.Object);

contextMock.SetupGet(c => c.Database).Returns(databaseFacadeMock.Object);

databaseFacadeMock
    .Setup(c => c.CreateExecutionStrategy())
    .Returns(() => new MockExecutionStrategy());