[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.
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());