使用身份验证提供程序集成测试 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();
    }

使用此设置,您可以毫无问题地测试您的项目。

如果您发现任何问题或您认为这是错误的,请随时纠正我。