public class TestStartup : Startup
{
private readonly Mock<ICarService> _carServiceMock;
public TestStartup(IConfiguration configuration) : base(configuration)
{
_carServiceMock = new Mock<ICarService>();
}
public override void ConfigureMyServices(IServiceCollection services)
{
services.AddSingleton(_carServiceMock.Object);
}
public override void ConfigureDatabase(IServiceCollection services)
{
services.AddDbContext<CarContext>(options => options.UseInMemoryDatabase("CarDb"));
services.AddTransient<DataSeed>();
}
}
public class TestFixture: IDisposable, ICollectionFixture<TestFixture>
{
public TestFixture()
{
_server = new TestServer(new WebHostBuilder()
.UseStartup<TestStartup>()
.UseEnvironment("Development"));
_client = _server.CreateClient();
}
}
Innen - Controller Ich verwende ICarService
die unter Verwendung von CarContext
Daten aus dem Db abzurufen.
public class CarController
{
private readonly ICarService _carService;
public CarController(ICarService carService)
{
_carService = carService;
}
[HttpGet]
public async Task<IActionResult> Get([FromRoute] int id)
{
var contact = await _carService.GetAsync(id); **// this is always null**
}
}
Meine Frage ist: Da dies ein Integrationstest ist, muss ich mich zuerst über ICarService lustig machen und wenn ja, was mache ich hier falsch?
Wenn Sie testen, wie die CarService
Klasse mit der Datenbank interagiert, sollten Sie sie nicht verspotten.
Sie möchten die reale CarService
Implementierung verwenden und die InMemoryDatabase als CarContext
Parameter in diese Klasse einfügen .
Entfernen Sie also die Mock<ICarService>
und registrieren Sie stattdessen die echte.
Warum gibt es null zurück?
Wenn Sie in Ihrem Beispiel die Methode _carService.GetAsync(id)
aufrufen, wird die Mock-Klasse aufgerufen . Sie haben jedoch Setup
keine Methoden für das Modell, sodass alle Aufrufe zurückgegeben werden null
.
Sie müssen Folgendes hinzufügen, damit die verspottete Methode einen Wert zurückgibt:
_carService.Setup(cs => cs.GetAsync(It.IsAny<int>()).Returns(1);
Dies würde jedoch nicht die In-Memory-Datenbank aufrufen, da Sie ein Modell für verwenden CarService
.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen