由于 HttpStatusCode.TemporaryRedirect,ASP.NET 核心单元测试在 VSTS 管道中失败
Unit tests for ASP.NET Core failing in VSTS pipeline due to HttpStatusCode.TemporaryRedirect
我有一个 ASP.NET Core 2.2 WebAPI,它使用 xUnit
和 FluentAssertions
框架。它创建了一个 Microsoft.AspNetCore.TestHost.TestServer
并且从那个服务器对象我们创建了一个 HttpClient
使用 Microsoft.AspNetCore.TestHost.TestServer.CreateClient()
API.
单元测试在我使用 Visual Studio 2017 Pro 的本地 Windows 10 机器上运行良好。我提交了代码,然后做了一个拉取请求。拉取请求会自动启动构建过程以确保构建成功。构建完成后,它会查找然后运行单元测试。在这一点上它失败了。我有 242 个单元测试。所有 242 单元测试均失败,代理报告的错误完全相同:
Expected resp.StatusCode to be OK, but found TemporaryRedirect.
所有 242 个单元测试都向测试服务器发出请求,因此它们都期望得到 HttpStatusCode.OK
(或类似期望的)响应。我永远不应该期待 HttpStatuscode.TemporaryRedirect
所以我真的不想为此添加测试用例。
构建服务器在 VSTS 中是 运行 作为安装了 Visual Studio 2017 Pro 的 Microsoft Server 2012 R2。
为什么 TestServer
对象 return 曾经是重定向?
如果没有办法解决这个问题,我可以强制 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
将是控制器的根,即:/api/MyController
感谢您的帮助。
我遇到的问题是因为这是在 startup.cs
:
中定义的
#if !DEBUG
app.UseHttpsRedirection();
#endif
所以当我 运行 在本地进行单元测试时,它被编译为 Debug,当它被推送到构建服务器时,它被编译为 Release 并且 Https-Redirection 被打开。
我取出该代码并通过在 Azure 中设置它使我的 WebAPI 仅 HTTPS。
我有一个 ASP.NET Core 2.2 WebAPI,它使用 xUnit
和 FluentAssertions
框架。它创建了一个 Microsoft.AspNetCore.TestHost.TestServer
并且从那个服务器对象我们创建了一个 HttpClient
使用 Microsoft.AspNetCore.TestHost.TestServer.CreateClient()
API.
单元测试在我使用 Visual Studio 2017 Pro 的本地 Windows 10 机器上运行良好。我提交了代码,然后做了一个拉取请求。拉取请求会自动启动构建过程以确保构建成功。构建完成后,它会查找然后运行单元测试。在这一点上它失败了。我有 242 个单元测试。所有 242 单元测试均失败,代理报告的错误完全相同:
Expected resp.StatusCode to be OK, but found TemporaryRedirect.
所有 242 个单元测试都向测试服务器发出请求,因此它们都期望得到 HttpStatusCode.OK
(或类似期望的)响应。我永远不应该期待 HttpStatuscode.TemporaryRedirect
所以我真的不想为此添加测试用例。
构建服务器在 VSTS 中是 运行 作为安装了 Visual Studio 2017 Pro 的 Microsoft Server 2012 R2。
为什么 TestServer
对象 return 曾经是重定向?
如果没有办法解决这个问题,我可以强制 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
将是控制器的根,即:/api/MyController
感谢您的帮助。
我遇到的问题是因为这是在 startup.cs
:
#if !DEBUG
app.UseHttpsRedirection();
#endif
所以当我 运行 在本地进行单元测试时,它被编译为 Debug,当它被推送到构建服务器时,它被编译为 Release 并且 Https-Redirection 被打开。
我取出该代码并通过在 Azure 中设置它使我的 WebAPI 仅 HTTPS。