web-dev-qa-db-fra.com

Comment se moquer de la nouvelle HttpClientFactory dans .NET Core 2.1 à l'aide de Moq

.NET Core 2.1 est livré avec cette nouvelle usine appelée HttpClientFactory, mais je ne peux pas comprendre comment le simuler pour tester un peu certaines méthodes qui incluent REST appels de service.

La fabrique est injectée à l'aide du conteneur .NET Core IoC, et la méthode consiste à créer un nouveau client à partir de la fabrique:

var client = _httpClientFactory.CreateClient();

Et puis en utilisant le client pour obtenir des données d'un service REST:

var result = await client.GetStringAsync(url);
15
Mauricio Atanache

En plus du post précédent qui décrit comment configurer un stub, vous pouvez simplement utiliser Moq pour configurer le DelegatingHandler:

var clientHandlerMock = new Mock<DelegatingHandler>();
clientHandlerMock.Protected()
    .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
    .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK))
    .Verifiable();
clientHandlerMock.As<IDisposable>().Setup(s => s.Dispose());

var httpClient = new HttpClient(clientHandlerMock.Object);

var clientFactoryMock = new Mock<IHttpClientFactory>(MockBehavior.Strict);
clientFactoryMock.Setup(cf => cf.CreateClient()).Returns(httpClient).Verifiable();

clientFactoryMock.Verify(cf => cf.CreateClient());
clientHandlerMock.Protected().Verify("SendAsync", Times.Exactly(1), ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>());
1
rdvanbuuren