【问题标题】:Integration testing an asp.net core with authentication providers与身份验证提供程序集成测试 asp.net 核心
【发布时间】:2018-01-30 05:15:40
【问题描述】:

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

谁能指出我正确的方向有什么问题?测试也会在构建服务器上运行吗?

【问题讨论】:

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


    【解决方案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();
        }
    

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

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

    【讨论】:

    • 如何处理 Authorize 属性?
    【解决方案2】:

    builder.AddUserSecrets()project.json 文件中读取您的 userSecretsId,该文件无法从测试项目中访问。您可以通过另一个仅实现可测试配置的 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>();
    }
    

    【讨论】:

    • 我是否必须将整个 Startup 类复制到这个新的 TestStartup 中?或者你有完整的例子吗?对我来说,这看起来不像是对您的环境的真正测试。
    • @ĐorđePetrović 很抱歉花了这么长时间来编辑我的答案,现在你可以测试一下
    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2016-10-13
    • 2019-08-05
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多