我有一个同时使用MVC和API控制器的有效的ASP.NET Core 2.2实现,并且我将一个集成测试项目组合在一起,以涵盖已经手动测试的所有内容-主要是基本内容。除了使用PostAsync来发布数据的测试之外,其他所有功能都可以正常工作。这些测试始终会从客户端获得500内部服务器错误作为响应,而我一生都无法弄清原因。哎呀!
TestServer设置是一种非常标准的方法,我在许多不同的博客和文章中都看到过。 TestStartup类扩展了标准的Startup,并覆盖了配置以将内存数据库与种子数据一起使用。然后,我的测试夹具库使用TestStartup创建服务器和客户端,并具有一个我知道可以正常工作的方法,以提取防伪令牌并将其添加到表单和标头中。验证CRUD其他所有方面的所有其他测试均正常运行,证明可以通过MVC和API调用来检索种子数据。
最终因500 Internal Server Error(内部服务器错误)而失败的POST调用确实使它进入了控制器以及后续的存储库。有了所有这些方面之后,我还无法看到500的来源。
[Fact]
public async void CreatePost_ShouldReturnViewWithNewlyCreatedLabelData()
{
// Arrange
var formData = await EnsureAntiForgeryTokenOnForm(new Dictionary<string, string>()
{
{ "Name", TestDataGraph.Labels.LabelNew.Name },
{ "WebsiteUrl", TestDataGraph.Labels.LabelNew.WebsiteUrl }
});
// Act
var response = await Client.PostAsync("/labels/create", new FormUrlEncodedContent(formData));
// Assert
Assert.Equal(HttpStatusCode.Found, response.StatusCode);
Assert.Equal("/Labels", response.Headers.Location.ToString());
}
这是Xunit中的一个简单示例测试,试图通过MVC路由来验证是否创建了一个新的简单对象,类型为Label,该对象遵循标准路径格式,已被脚手架安装。该测试会将其放入控制器及其存储库中,但响应将是500 Internal Server Error。
我会错过启动中的重要内容吗?有什么想法可以找到有关此故障的更多详细信息?提前致谢!如果有帮助,我可以发布更多代码或详细信息。
答案 0 :(得分:1)
尝试添加跟踪日志记录...跟踪日志记录将在.Net Core框架中显示活动。
...
public static ILogger<ConsoleLoggerProvider> AppLogger = null;
public static ILoggerFactory loggerFactory = null;
//
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(builder => builder
.AddConsole()
.AddFilter(level => level >= LogLevel.Trace)
);
loggerFactory = services.BuildServiceProvider().GetService<ILoggerFactory>();
AppLogger = loggerFactory.CreateLogger<ConsoleLoggerProvider>();
...
示例跟踪日志:
trce: Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler[7]
Could not find a file for view at path '/Views/Home/_Layout.cshtml'.
解决问题后,将LogLevel更改为更合适的值。