Provo a testare la mia app, quindi ho bisogno di deridere il mio contesto EF.
Il mio codice sembra essere ok, ma ho la seguente eccezione:
"System.ArgumentNullException: il valore non può essere nullo. Nome parametro: origine"
Ecco il mio metodo di prova:
var options = new DbContextOptionsBuilder<ProductContext>().Options;
var settings = new SqlSettings
{
InMemory = true
};
var context = new Mock<ProductContext>(options, settings);
var mockTreeService = new TreeService(context.Object);
await mockTreeService.CreateTreeAsync("Testing tree", Guid.NewGuid());
context.Verify(x => x.AddAsync(It.IsAny<Tree>(), CancellationToken.None), Times.Once);
Sembra che questa eccezione venga generata durante l'esecuzione di questo pezzo di codice
var tree = await _context.Trees
.Include(x => x.Translation)
.FirstOrDefaultAsync(x => x.Translation.Pl == name);
Viene dal mio servizio che sto testando
Penso che questo sia dovuto al non avere una serie di stringhe di connessione. Francamente, è un po 'difficile prendere in giro completamente DbContext
, motivo per cui il team EF Core ha fornito un'implementazione in-memory. Questo è molto più facile da usare a scopo di test. Basta modificare l'inizializzazione delle options
per:
var options = new DbContextOptionsBuilder<ProductContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
Successivamente, sarà necessario popolare il database con i dati di test. Quindi, puoi eseguire il resto del test.
Nota: se si utilizza il database in memoria, non è più necessario prendere in giro il contesto, in modo da poter rimuovere quel bit di codice. Il database in memoria è essenzialmente, di per sé, una finta.
Ho usato questa https://github.com/huysentruitw/entity-framework-core-mock library. Molto semplice e può scrivere test di unità utilizzando meno codice.
È possibile utilizzare la maggior parte dei metodi Moq se si utilizza il framework moq.
Di seguito è riportato un codice di esempio per test DBQuerys.
public async Task<Boat> GetByIdAsync(string id)
=> await _boatContext.Boats.Where(x => x.id == id).FirstOrDefaultAsync();
[Fact]
public async Task GetByIdAsync_WhenCalled_ReturnsItem()
{
// Arrange
var models = new[] { new Boat { id = "p1" } };
var dbContextMock = new DbContextMock<BoatContext>();
dbContextMock.CreateDbQueryMock(x => x.Boats, models);
var service = new Properties(dbContextMock.Object);
// Act
var okResult = await service.GetByIdAsync("p1");
// Assert
Assert.IsType<Boat>(okResult.Result);
}
Pubblicare qui può aiutare qualcuno :)