VS 2017 ASP.NET核心测试项目--Microsoft.AspNetCore.Identity缺失

时间:2017-03-07 23:29:18

标签: c# .net asp.net-core-mvc xunit visual-studio-2017

我正在尝试使用Microsoft.AspNetCore.TestHost

为空的.NET Core ASP站点编写集成测试
Microsoft.AspNetCore.Mvc.Razor.Compilation.CompilationFailedException :
One or more compilation failures occurred:
/Views/_ViewImports.cshtml(5,28): 

error CS0234: The type or namespace name 'Identity' 
does not exist in the namespace 'Microsoft.AspNetCore' 
(are you missing an assembly reference?) 4uvgaffv.11j(34,11): 

error CS0246: The type or namespace name 'System' could not be found 
(are you missing a using directive or an assembly reference?)

My Test类与文档类相同,如下所示:

public class UnitTest1
{
    private readonly TestServer _server;
    private readonly HttpClient _client;
    public UnitTest1()
    {
        // Arrange
        _server = new TestServer(new WebHostBuilder()
            .UseContentRoot(ContentPath)
            .UseStartup<Startup>());

        _client = _server.CreateClient();
    }

    [Fact]
    public async Task ReturnHelloWorld()
    {
        // Act
        var response = await _client.GetAsync("/");

        response.EnsureSuccessStatusCode();

        var body = await response.Content.ReadAsStringAsync();

        // Assert
        Console.WriteLine("Test");
    }

    private static string ContentPath
    {
        get
        {
            var path = PlatformServices.Default.Application.ApplicationBasePath;
            var contentPath = Path.GetFullPath(Path.Combine(path, $@"..\..\..\..\{nameof(DataTests)}"));
            return contentPath;
        }
    }
}

我尝试将Microsoft.AspNetCore.Identity 1.1.1 NuGet包添加到Test项目(与MVC Project相同),但它没有做任何事情,尽管我可以在Dependencies下拉列表中看到它丢失:

enter image description here

我尝试重新安装这些软件包,dotnet builddotnet restore,干净重建,但仍然没有运气。

任何想法?

FIX

对此的最终修复是(感谢@Jeffrey

WebHostBuilderExtensions.cs

public static class WebHostBuilderExtensions
{
    private static string ContentPath
    {
        get
        {
            var path = PlatformServices.Default.Application.ApplicationBasePath;
            var contentPath = Path.GetFullPath(Path.Combine(path, $@"..\..\..\..\{nameof(DataTests)}"));
            return contentPath;
        }
    }

    public static IWebHostBuilder ConfigureTestContent(this IWebHostBuilder builder)
    {
        return builder.UseContentRoot(ContentPath);
    }

    public static IWebHostBuilder ConfigureTestServices(this IWebHostBuilder builder)
    {
        return builder.ConfigureServices(services =>
        {
            services.AddMvcCore();
            services.Configure((RazorViewEngineOptions options) =>
            {
                var previous = options.CompilationCallback;
                options.CompilationCallback = (context) =>
                {
                    previous?.Invoke(context);

                    var assembly = typeof(Startup).GetTypeInfo().Assembly;
                    var assemblies = assembly.GetReferencedAssemblies()
                                             .Select(x => MetadataReference.CreateFromFile(Assembly.Load(x).Location))
                                             .ToList();
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("mscorlib")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Private.Corelib")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.ApplicationInsights.AspNetCore")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Html.Abstractions")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Razor")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Razor.Runtime")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Mvc")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Dynamic.Runtime")).Location));
                    assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Text.Encodings.Web")).Location));

                    context.Compilation = context.Compilation.AddReferences(assemblies);
                };
            });

            services.AddApplicationInsightsTelemetry();
        });
    }
}

test.cs中

public class UnitTest1
{
    private readonly TestServer _server;
    private readonly HttpClient _client;
    private readonly ITestOutputHelper output;

    public UnitTest1(ITestOutputHelper output)
    {
        this.output = output;

        // Arrange
        _server = new TestServer(new WebHostBuilder()
            .ConfigureTestContent()
            .ConfigureLogging(l => l.AddConsole())
            .UseStartup<Startup>()
            .ConfigureTestServices());

        _client = _server.CreateClient();
    }

    [Fact]
    public async Task ReturnHelloWorld()
    {
        // Act
        var response = await _client.GetAsync("/");

        response.EnsureSuccessStatusCode();

        var body = await response.Content.ReadAsStringAsync();

        // Assert
        output.WriteLine(body);
    }
}

1 个答案:

答案 0 :(得分:3)

有同样的问题..经过一番挖掘后发现了一个有效的解决方案..

Razor中使用的roslyn编译器不包含主程序集的引用程序集。 所以我通过查找它们来添加这些

在测试类中添加以下代码..在我的机器上运行

private static string ContentPath
{
    get
    {
        var path = PlatformServices.Default.Application.ApplicationBasePath;
        var contentPath = Path.GetFullPath(Path.Combine(path, $@"..\..\..\..\{nameof(src)}"));
        return contentPath;
    }
}

var builder = new WebHostBuilder()
    .UseContentRoot(ContentPath)
    .ConfigureLogging(factory =>
    {
        factory.AddConsole();
    })
    .UseStartup<Startup>()
    .ConfigureServices(services =>
     {
         services.Configure((RazorViewEngineOptions options) =>
         {
             var previous = options.CompilationCallback;
             options.CompilationCallback = (context) =>
             {
                 previous?.Invoke(context);

                 var assembly = typeof(Startup).GetTypeInfo().Assembly;
                 var assemblies = assembly.GetReferencedAssemblies().Select(x => MetadataReference.CreateFromFile(Assembly.Load(x).Location))
                 .ToList();
                 assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("mscorlib")).Location));
                 assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Private.Corelib")).Location));
                 assemblies.Add(MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Razor")).Location));

                 context.Compilation = context.Compilation.AddReferences(assemblies);
             };
         });
     });

    _server = new TestServer(builder);

GitHub repo https://github.com/aspnet/Hosting/issues/954

上的相同问题