使用身份验证提供程序集成测试 asp.net 核心
Integration testing an asp.net core with authentication providers
我是 asp.net 核心的新手。目前我正在开发一个小型网站,该网站使用来自 Google、Facebook 和 Microsoft 的身份验证提供程序。
现在我想为我的 HomeController
.
编写一些集成测试
这是我的测试 class 的样子:
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:
'System.InvalidOperationException' 类型的异常发生在 Microsoft.Extensions.Configuration.UserSecrets.dll 中,但未在用户代码中处理。
任何人都可以指出正确的方向可能是错的吗?也会在构建服务器上进行测试 运行 吗?
builder.AddUserSecrets()
从 project.json
文件中读取您的 userSecretsId
,该文件无法从测试项目访问。您可以通过另一个 TestStartup Class 运行 您的测试服务器,它只实现可测试的配置。
_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>();
}
我终于有时间看看我的问题了。感谢@Gevorg Narimanyan 将我推向正确的方向。我在 Whosebug 上找到了 post 对我也有帮助。
这是我的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>();
}
}
这就是我测试中的设置 class:
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();
}
使用此设置,您可以毫无问题地测试您的项目。
如果您发现任何问题或您认为这是错误的,请随时纠正我。
我是 asp.net 核心的新手。目前我正在开发一个小型网站,该网站使用来自 Google、Facebook 和 Microsoft 的身份验证提供程序。
现在我想为我的 HomeController
.
这是我的测试 class 的样子:
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:
'System.InvalidOperationException' 类型的异常发生在 Microsoft.Extensions.Configuration.UserSecrets.dll 中,但未在用户代码中处理。
任何人都可以指出正确的方向可能是错的吗?也会在构建服务器上进行测试 运行 吗?
builder.AddUserSecrets()
从 project.json
文件中读取您的 userSecretsId
,该文件无法从测试项目访问。您可以通过另一个 TestStartup Class 运行 您的测试服务器,它只实现可测试的配置。
_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>();
}
我终于有时间看看我的问题了。感谢@Gevorg Narimanyan 将我推向正确的方向。我在 Whosebug 上找到了 post
这是我的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>();
}
}
这就是我测试中的设置 class:
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();
}
使用此设置,您可以毫无问题地测试您的项目。
如果您发现任何问题或您认为这是错误的,请随时纠正我。