unit-testing - ASP.net 核心集成测试与继承的 Startup 类。找不到查看
问题描述
我正在尝试针对 aspnet core 2.2 编写一些集成测试。我想使用继承自普通 Startup 类的 TestStartup 类来配置资源和服务以进行测试。
一个简单的例子(可以在这里找到:https ://github.com/davidgouge/aspnet-integration-testing ):
我有一个包含两个项目的解决方案:
IntegrationTestingWeb(一个准系统 aspnet mvc 应用程序) IntegrationTestingTests(一个测试项目)
我有一个使用 Web Startup 类的测试,并断言 OK 是从/Home/Privacy
[Test]
public async Task GetPrivacy_Through_Normal_Startup()
{
var builder = new WebHostBuilder().UseStartup<Startup>();
var client = new TestServer(builder).CreateClient();
var result = await client.GetAsync("/Home/Privacy");
result.StatusCode.Should().Be(HttpStatusCode.OK);
}
该测试通过。
如果我创建了一个继承自 Startup 的 TestStartupInTestProject 类,但将其放在 Tests 项目中,那么在创建 WebHostBuilder 时我必须做一些额外的工作,但随后测试失败。
[Test]
public async Task GetPrivacy_Through_Test_Startup_In_Test_Project()
{
var builder = new WebHostBuilder().ConfigureServices(services =>
{
var startupAssembly = typeof(TestStartupInTestProject).GetTypeInfo().Assembly;
var manager = new ApplicationPartManager();
manager.ApplicationParts.Add(new AssemblyPart(startupAssembly));
manager.ApplicationParts.Add(new AssemblyPart(typeof(HomeController).Assembly));
manager.FeatureProviders.Add(new ControllerFeatureProvider());
manager.FeatureProviders.Add(new ViewComponentFeatureProvider());
services.AddSingleton(manager);
}).UseStartup<TestStartupInTestProject>();
var client = new TestServer(builder).CreateClient();
var result = await client.GetAsync("/Home/Privacy");
result.StatusCode.Should().Be(HttpStatusCode.OK);
}
失败的错误是:
Tests.Tests.GetPrivacy_Through_Test_Startup_In_Test_Project
System.InvalidOperationException : The view 'Privacy' was not found. The
following locations were searched:
/Views/Home/Privacy.cshtml
/Views/Shared/Privacy.cshtml
/Pages/Shared/Privacy.cshtml
所以看起来因为我的 Startup 类位于 Test 项目中,所以无法找到视图。我缺少什么设置才能找到视图?
解决方案
事实证明我.UseContentRoot(Directory.GetCurrentDirectory() + "\\..\\..\\..\\..\\IntegrationTestingWeb")
在创建 WebHostBuilder 时丢失了。听起来,它设置了应用程序将在其中查找视图等的根目录。
推荐阅读
- typo3-8.x - Typo3 和 DirectMail - 纯文本
- python - Python - 将 JSON 模式转换为 JSON 模板
- wiremock - 使用单个端口创建单个 WireMockServer 对象
- mysql - Django Check Constraint for MySQL 5.7 替代品
- ios - UIView 扩展在应用首次启动时不起作用
- json - 错误 data.forEach 不是函数(如何提取对象的 Json 对象)
- python - Python - 从嵌套列表中提取值
- arrays - 组合对象流中的数组
- python - 读取文件并用 python 替换 LF,但不是 CR-LF
- r - 用循环绑定嵌套列表中的 tibbles 行,无论 tibbles 的数量是多少