集成测试asp.net核心与身份验证提供程序

时间:2016-10-15 18:27:04

标签: c# asp.net authentication asp.net-core integration-testing

我是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'类型的异常,但未在用户代码中处理。

有人能指出正确的方向吗?测试也会在构建服务器上运行吗?

2 个答案:

答案 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();
    }

通过此设置,您可以毫无问题地测试项目。

如果您发现任何问题或者您认为这是错误的,请不要犹豫纠正我。