У меня есть ASP. NET Core 2.2 WebAPI, который использует платформы xUnit
и FluentAssertions
. Он создает Microsoft.AspNetCore.TestHost.TestServer
, и из этого серверного объекта мы создаем HttpClient
с использованием Microsoft.AspNetCore.TestHost.TestServer.CreateClient()
API.
Модульные тесты прекрасно работают на моей локальной машине Windows 10 с использованием Visual Studio 2017 Pro. Я зафиксировал код, затем сделал запрос на удаление. Вытягивающий запрос автоматически запускает процесс сборки, чтобы обеспечить его сборку. Как только он собирается, он ищет и запускает модульные тесты. На данный момент это не удается. У меня 242 юнит-тестов. Все 242 модульных теста завершаются неудачно с той же ошибкой, о которой сообщил агент:
Expected resp.StatusCode to be OK, but found TemporaryRedirect.
Все 242 модульных теста отправляют запрос на тестовый сервер, поэтому все они ожидают HttpStatusCode.OK
(или аналогично ожидаемый) ответ. Я никогда не должен ожидать HttpStatuscode.TemporaryRedirect
, поэтому я действительно не хочу добавлять тестовый пример для этого.
Сервер сборки работает в VSTS как Microsoft Server 2012 R2 с установленной Visual Studio 2017 Pro.
Почему объект TestServer
будет когда-либо возвращать перенаправление?
Если нет способа обойти это, могу ли я принудительно HttpClient
автоматически перенаправить, когда он получает этот статус, поэтому я получаю только результат вызова API?
Вот код, который я использую для создания сервера и клиента:
var config = new ConfigurationBuilder()
.SetBasePath(Path.GetFullPath("../../../../XXXXXXXXService/"))
.AddJsonFile("appsettings.json", optional: false)
.Build();
_server = new TestServer(new WebHostBuilder().UseStartup<Startup>().UseConfiguration(config));
TestHttpClient = _server.CreateClient();
Пример модульного теста, который не проходит:
private string DeriveHttpPath(string path) =>
$"/{_rootPath.Trim('/')}/{path.TrimStart('/')}";
private static async Task<TResult> ValidateAndReadResponseAsync<TResult>(
HttpResponseMessage resp, HttpStatusCode statusShouldBe, Func<TResult> defFactory = null)
{
(resp.IsSuccessStatusCode ? HttpStatusCode.OK : resp.StatusCode).Should().Be(statusShouldBe);
try
{
return await resp.Content.ReadAsAsync<TResult>();
}
catch (Exception ex)
{
return defFactory != null ? defFactory.Invoke() : throw ex;
}
}
public async Task<TResult> GetDocumentDataAsync<TResult>(string documentId,
string path = null, HttpStatusCode statusShouldBe = HttpStatusCode.OK)
{
using (var msg = new HttpRequestMessage(HttpMethod.Get,
DeriveHttpPath($"{_collectionId}/{documentId}?path={path}")))
using (var resp = await _httpClient.SendAsync(msg))
{
return await ValidateAndReadResponseAsync<TResult>(resp, statusShouldBe);
}
}
_rootPath
будет root контроллера, то есть: /api/MyController
Спасибо за любую помощь.