То есть по замыслу. Если вы проверите исходный код TestServer
public HttpMessageHandler CreateHandler()
{
var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress);
return new ClientHandler(pathBase, Application) { AllowSynchronousIO = AllowSynchronousIO, PreserveExecutionContext = PreserveExecutionContext };
}
public HttpClient CreateClient()
{
return new HttpClient(CreateHandler()) { BaseAddress = BaseAddress };
}
, вы увидите, что он не включает функцию автоматического перенаправления, которая на самом деле является частью HttpClientHandler
, обычно используемой по умолчанию HttpClient
.
TestServer
, однако, использует пользовательский обработчик, который не перенаправляет автоматически при создании HttpClient
. Вам потребуется доступ к обработчику, который вы не можете получить, поскольку тестовый сервер создает клиента внутри себя.
Поэтому описанный код ведет себя так, как ожидалось.
Статус ответа HTTP код 302 Найденный является распространенным способом выполнения перенаправления.
Проверьте заголовок ответа, чтобы убедиться, что заголовок местоположения перенаправления находится на желаемом URL-адресе для подтверждения ожидаемого поведения.
Вы можете также попробуйте вручную вызвать перенаправленный URL-адрес, чтобы убедиться, что он вернет код состояния ответа HTTP 200 OK
[Test]
public async Task RunARoute_Should_Redirect() {
_server.PreserveExecutionContext = true;
var client = _server.CreateClient();
var response = await _client.GetAsync("/foo");
Check.That(response.StatusCode).IsEqualTo(HttpStatusCode.Found); //302 Found
var redirectUrl = response.Headers.Location;
//assert expected redirect URL
//...
response = await _client.GetAsync(redirectUrl);
Check.That(response.IsSuccessStatusCode).IsTrue(); //200 OK
}