HttpConfiguration из System.Web.Http в проекте .NET 5
Обновлять:
Пример полного кода:
public class DelegatingHandlerStub : DelegatingHandler {
private readonly Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> _handlerFunc;
public DelegatingHandlerStub() {
_handlerFunc = (request, cancellationToken) => Task.FromResult(request.CreateResponse(HttpStatusCode.OK));
}
public DelegatingHandlerStub(Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> handlerFunc) {
_handlerFunc = handlerFunc;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
return _handlerFunc(request, cancellationToken);
}
}
public async Task Should_Return_Ok() {
//Arrange
var expected = "Hello World";
var mockFactory = new Mock<IHttpClientFactory>();
var configuration = new HttpConfiguration();
var clientHandlerStub = new DelegatingHandlerStub((request, cancellationToken) => {
request.SetConfiguration(configuration);
var response = request.CreateResponse(HttpStatusCode.OK, expected);
return Task.FromResult(response);
});
var client = new HttpClient(clientHandlerStub);
mockFactory.Setup(_ => _.CreateClient(It.IsAny<string>())).Returns(client);
IHttpClientFactory factory = mockFactory.Object;
var controller = new ValuesController(factory);
//Act
var result = await controller.Get();
//Assert
result.Should().NotBeNull();
var okResult = result as OkObjectResult;
var actual = (string) okResult.Value;
actual.Should().Be(expected);
}
Оригинал:
Я следую этому руководству, чтобы поиздеваться
IHttpClientFactory
.
Для работы мне нужна следующая строка:
var configuration = new HttpConfiguration();
Исправление Visual Studios:
Install package 'Microsoft.AspNet.WebApi.Core'
.
Это работает, и код работает нормально, но я получаю следующее предупреждение:
Предупреждение NU1701 Пакет «Microsoft.AspNet.WebApi.Core 5.2.7» был восстановлен с помощью .NETFramework,Version = v4.6.1, .NETFramework,Version = v4.6.2, .NETFramework,Version = v4.7, .NETFramework,Version = v4.7.1, .NETFramework,Version = v4.7.2, .NETFramework,Version = v4.8'вместо целевой платформы проекта' net5.0 '. Этот пакет может быть не полностью совместим с вашим проектом.
Я пробовал установить
Microsoft.AspNetCore.Mvc.WebApiCompatShim
это было рекомендовано ниже, но это не работает.
https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.WebApiCompatShim
/questions/48870426/systemwebhttp-otsutstvuet-vnet-core-21/50472314#50472314
Есть ли другой NuGet, который можно использовать для решения этой проблемы?
Рассматривая зависимости для
Microsoft.AspNet.WebApi.Core
это зависит только от
Microsoft.AspNet.WebApi.Client
что, в свою очередь, использует
.NETStandard 2.0
. В идеале я бы не хотел создавать новый проект, ориентированный на
.NET Standard 2.0
и поместите туда код. Я хотел бы использовать
.NET 5
проект.
https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Core/
https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/
https://docs.microsoft.com/en-us/dotnet/standard/net-standard
2 ответа
Я не попал
.NET 5
поэтому я решил это, устранив необходимость в
HttpConfiguration
так:
private LoginController GetLoginController()
{
var expected = "Hello world";
var mockFactory = new Mock<IHttpClientFactory>();
var mockMessageHandler = new Mock<HttpMessageHandler>();
mockMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(expected)
});
var httpClient = new HttpClient(mockMessageHandler.Object);
mockFactory.Setup(_ => _.CreateClient(It.IsAny<string>())).Returns(httpClient);
var logger = Mock.Of<ILogger<LoginController>>();
var controller = new LoginController(logger, mockFactory.Object);
return controller;
}
Если это сделано для тестирования, я предлагаю использовать заглушку вместо имитации.CreateClient - это метод расширения, и над ним не так просто издеваться. Использовать заглушку намного проще.
public class MyHttpClientFactory : IHttpClientFactory
{
public HttpClient CreateClient(string name)
{
return new HttpClient();
}
}
В зависимости от вашего кода у вас могут возникнуть проблемы с введением
MyMyHttpClientFactory