首页 新闻 会员 周边

ASP.NET Core 集成测试问题

0
悬赏园豆:30 [已解决问题] 解决于 2018-08-24 22:29

运行 ASP.NET Core 集成测试时出现下面的错误:

System.InvalidOperationException : No method 'public static IWebHostBuilder CreateWebHostBuilder(string[] args)' found on 'AutoGeneratedProgram'. Alternatively, WebApplicationFactory`1 can be extended and 'protected virtual IWebHostBuilder CreateWebHostBuilder()' can be overridden to provide your own IWebHostBuilder instance.
Stack Trace:
   at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateWebHostBuilder()

请问如何解决?

问题补充:

查看 WebApplicationFactory 的源代码 ,知道了异常是在下面的代码中抛出的

var builder = WebHostBuilderFactory.CreateFromTypesAssemblyEntryPoint<TEntryPoint>(Array.Empty<string>());
if (builder == null)
{
    throw new InvalidOperationException(Resources.FormatMissingCreateWebHostBuilderMethod(
        nameof(IWebHostBuilder),
        typeof(TEntryPoint).Assembly.EntryPoint.DeclaringType.FullName,
        typeof(WebApplicationFactory<TEntryPoint>).Name,
        nameof(CreateWebHostBuilder)));
}
dudu的主页 dudu | 高人七级 | 园豆:30994
提问于:2018-08-24 19:09
< >
分享
最佳答案
0

WebApplicationFactory<TEntryPoint> 默认是在 TEntryPoint 所在的程序集中寻找 Program 。出现上面的问题是由于 IClassFixture< WebApplicationFactory<TestStartup>> 中的 TestStartup 是在集成测试的项目中,不在所测试的 ASP.NET Core 项目中,如果将 TestStartup 改为 ASP.NET Core 项目中的 Startup 就没这个问题。

TestStartup 继承自 Startup ,我不想把 TestStartup 放到 ASP.NET Core 项目中,最终采取的解决方案如下:

public class UploadWebAppFactory<TStartup, TTestStartup> : WebApplicationFactory<TStartup>
    where TStartup : class
    where TTestStartup : class
{
    protected override TestServer CreateServer(IWebHostBuilder builder)
    {
        builder.UseStartup<TTestStartup>();
        return base.CreateServer(builder);
    }
}
dudu | 高人七级 |园豆:30994 | 2018-08-24 22:27

如果 TestStartup 没有继承 Startup ,需要采用下面的方法:

public class BlogAdminWebFactory : WebApplicationFactory<TestStartup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.CreateDefaultBuilder()
            .UseStartup<TestStartup>();
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.UseContentRoot(".");
        base.ConfigureWebHost(builder);
    }
}

相关链接:https://github.com/aspnet/Docs/issues/7063

dudu | 园豆:30994 (高人七级) | 2019-03-30 15:45

对于 TestStartup 没有继承 Startup 的情况,发现了一个更简单的解决方法

public class BlogAdminWebFactory : WebApplicationFactory<Startup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.CreateDefaultBuilder()
            .UseStartup<TestStartup>();
    }
}
dudu | 园豆:30994 (高人七级) | 2019-05-28 11:31
其他回答(1)
0

检查一下program.com

收获园豆:30
知了&& | 园豆:248 (菜鸟二级) | 2018-08-24 20:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册