我是asp.net核心的新手。目前,我正在开发一个使用Google,Facebook和Microsoft身份验证提供商的小型网站。
现在我想为我的HomeController
编写一些集成测试。
这是我的测试类的样子:
public class HomeControllerTests : IDisposable
{
private HomeController _homeController;
private readonly TestServer _server;
private readonly HttpClient _client;
public HomeControllerTests()
{
_server = new TestServer(new WebHostBuilder().UseEnvironment("Development").UseStartup<Startup>());
_client = _server.CreateClient();
}
[Fact]
public async void Test()
{
var result = await _client.GetAsync("/");
Assert.NotNull(result);
}
public void Dispose()
{
_server.Dispose();
_client.Dispose();
}
}
现在在
的Startup.cs中builder.AddUserSecrets();
抛出InvalidOperationException:
Microsoft.Extensions.Configuration.UserSecrets.dll中发生了'System.InvalidOperationException'类型的异常,但未在用户代码中处理。
有人能指出正确的方向吗?测试也会在构建服务器上运行吗?
答案 0 :(得分:1)
builder.AddUserSecrets()
从userSecretsId
文件中读取project.json
,该文件无法从测试项目中访问。您可以通过另一个仅实现可测试配置的TestStartup类来运行您的测试服务器。
_server = new TestServer(new WebHostBuilder()
.UseEnvironment("Development")
.UseStartup<TestStartup>());
class TestStartup
{
public TestStartup (IHostingEnvironment env)
{
...
}
}
如果您需要使用所有相关配置测试您的真实项目,请执行以下操作。
_server = new TestServer(Program.GetHostBuilder()
.UseContentRoot(@"YourFullPathToProjectWhichyoutest"));
_client = _server.CreateClient();
在您要测试的项目中,将program.cs文件更改为
public static void Main(string[] args)
{
var host = GetHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.Build();
host.Run();
}
//move your common configurations here
public static IWebHostBuilder GetHostBuilder()
{
return new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>();
}
答案 1 :(得分:1)
我终于有时间看看我的问题了。感谢@Gevorg Narimanyan推动我走向正确的方向。我在StackOverflow上发现了一个帖子here也帮助了我。
这是我的Programs.cs
public class Program
{
public static void Main(string[] args)
{
var host = GetHostBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.Build();
host.Run();
}
public static IWebHostBuilder GetHostBuilder(string[] args)
{
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.AddEnvironmentVariables(prefix: "ASPNETCORE_")
.Build();
return new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
}
}
这就是我的测试类中的设置:
public HomeControllerTests()
{
var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var projectPath = Path.GetFullPath(Path.Combine(basePath, "../../../../WebProjectNameYouWantToTest"));
_server = new TestServer(Program.GetHostBuilder(new string[] {}).UseContentRoot(projectPath).UseEnvironment("Development").UseStartup<Startup>());
_client = _server.CreateClient();
}
通过此设置,您可以毫无问题地测试项目。
如果您发现任何问题或者您认为这是错误的,请不要犹豫纠正我。