我正在尝试使用Microsoft.AspNetCore.TestHost
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
下拉列表中看到它丢失:
我尝试重新安装这些软件包,dotnet build
,dotnet restore
,干净重建,但仍然没有运气。
任何想法?
对此的最终修复是(感谢@Jeffrey
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();
});
}
}
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);
}
}
答案 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
上的相同问题