c# - VS 2017 ASP.NET Core 测试项目 - Microsoft.AspNetCore.Identity 缺失

标签 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?)

我的测试类与文档类相同,如下所示:

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 包添加到测试项目(与 MVC 项目相同)但它没有做任何事情,尽管我可以看到它丢失在 Dependencies 下拉列表中:

enter image description here

我已尝试重新安装这些软件包、dotnet builddotnet restore、clean rebuild,但仍然没有成功。

有什么想法吗?

修复

对此的最终修复是(感谢@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();
        });
    }
}

测试.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);
    }
}

最佳答案

有同样的问题..经过一些挖掘找到了一个可行的解决方案..

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

在测试类中添加以下代码.. Works on my machine™

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 存储库上的相同问题 https://github.com/aspnet/Hosting/issues/954

关于c# - VS 2017 ASP.NET Core 测试项目 - Microsoft.AspNetCore.Identity 缺失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42660294/

相关文章:

c# - 第二个窗体首先加载,主窗体在第一个窗体关闭之前不可见

c# - 如何实现 PerGraph 生活方式

c# - 在 C# 中清除 ColorConvertedBitmap

iis - 部署 .NET Core ASP.NET 网站 - HTTP 错误 502.5 - 进程失败

c# - ASP.Net Core 单元测试异步 Controller

javascript - 使用日期时间选择器进行日期和时间验证 (ASP.Net MVC Core v1.1)

c# - Word Addin VBA-C# 转换,InputBox

c# - Azure 上 ASP.NET Core 1.0 Web Kestrel 应用程序的配置

c# - 如何在 C# 中确定数字类型是有符号还是无符号

c# - EF 代码第一个 NotMapped 属性