我使用的是aspnetboileplate 5.1.0。
在ProjectName.Web.Tests
中,我遇到了无法解决的情况。
我已经使用[Fact]
或[Theory]
为我的控制器设置了web测试。当我尝试使用webtestbase类中的GetResponseAsString(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK)
运行测试时。所有测试都失败了。
以下是我的测试示例:
[Fact]
public async Task Index_Test()
{
//Act
var response = await GetResponseAsStringAsync(
GetUrl<HomeController>(nameof(HomeController.Index))
);
//Assert
response.ShouldNotBeNullOrEmpty();
}
测试都失败了:
Message:
Shouldly.ShouldAssertException : response.StatusCode
should be
HttpStatusCode.OK
but was
HttpStatusCode.NotFound
我在版本3.8.3和4.2.1中有其他aspnetboileplate项目,web测试工作得很好。所以我不知道为什么服务器无法在我的控制器上找到操作方法。
在ProjectName.Tests
项目中发现的服务测试运行良好。
我找到了罪魁祸首。我遇到的问题是由于试图从一个aspnetboileplate项目模板存储库中复制一个用于web单元测试的项目,并更新所有引用和类名以匹配目标VS解决方案中的名称和命名空间。
我在aspnetboilerplate github帐户上提交了一个类似的问题。https://github.com/aspnetboilerplate/aspnetboilerplate/issues/5463.
最终,事情是这样的。
在经历了与新项目相同的过程之后。我发现在在方法中默认命名为AbpProjectNameWebTestBase.cs
的类文件protected override IWebHostBuilder CreateWebHostBuilder()
{
return base
.CreateWebHostBuilder()
.UseContentRoot(ContentRootFolder.Value)
.UseSetting(WebHostDefaults.ApplicationKey, typeof(AbpProjectNameWebModule).Assembly.FullName);
}
我错误地将AbpProjectNameWebModule
替换为AbpProjectNameTestModule
而不是AbpProjectNameWebMvcModule
。这是在尝试将应用程序服务单元测试项目用作web项目。因此,它找不到任何引用的URI,因此返回了httpStatusCode.NotFound
。
在固定此参考之后。我开始获取与public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
方法有关的异常。
这些内容包括添加app.UseAuthentication()
和app.UseAuthorization()
,以及需要添加中间件来为上下文提供ClaimsIdentity和ClaimsPrincipal。用户(即app.UserMiddleware<TestAuthenticationMiddleware>()
(
现在,我可以像以前的版本一样运行我的web单元测试了。