我正在尝试在单元测试项目中使用RazorViewToStringRenderer . 但是,当我调用它时,我收到与剃刀编译相关的错误:
缺少一个或多个编译引用 . 确保您的项目引用了“Microsoft.NET.Sdk.Web”,并且“PreserveCompilationContext”属性未设置为false .
.cshtml文件包含在测试项目中作为嵌入式资源和单元测试项目引用 Microsoft.AspNetCore.All 它在我运行Web项目时起作用,但是当我从单元测试项目中调用它时它不起作用:
var sp = ConfigureServices();
sp.GetService<RazorViewToStringRenderer>();
void ConfigureServices()
{
var services = new ServiceCollection();
var applicationEnvironment = PlatformServices.Default.Application;
services.AddSingleton(applicationEnvironment);
services.AddSingleton<IHostingEnvironment>(new HostingEnvironment
{
WebRootFileProvider = new PhysicalFileProvider(applicationEnvironment.ApplicationBasePath),
ApplicationName = Path.GetFileName(applicationEnvironment.ApplicationBasePath)
});
var diagnosticSource = new DiagnosticListener("Microsoft.AspNetCore");
services.AddSingleton<DiagnosticSource>(diagnosticSource);
services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.AddLogging();
var embeddedProvider = new EmbeddedFileProvider(typeof(Startup).Assembly); //needed for mailtemplates
var compositeProvider = new CompositeFileProvider(embeddedProvider);
services.AddSingleton(compositeProvider);
services.AddMvc().AddRazorOptions(options => options.FileProviders.Add(compositeProvider));
services.AddTransient<RazorViewToStringRenderer>();
return services.BuildServiceProvider();
}
{Microsoft.AspNetCore.Mvc.Razor.Compilation.CompilationFailedException:发生了一个或多个编译失败:lfrn3mzv.yfv(4,62):错误CS0012:类型“属性”在未引用的程序集中定义 . 您必须添加对程序集'netstandard,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'的引用 . lfrn3mzv.yfv(4,81):错误CS0518:未定义或导入预定义类型'System.String'lfrn3mzv.yfv(4,145):错误CS0518:未定义或导入预定义类型'System.Type'lfrn3mzv.yfv( 4,11):lfrn3mzv.yfv(11,11):错误CS0246:找不到类型或命名空间名称'System'(您是否缺少using指令或程序集引用?)lfrn3mzv.yfv(14,36) :错误CS0234:命名空间“Microsoft.AspNetCore.Mvc”中不存在类型或命名空间名称“ViewFeatures”(您是否缺少程序集引用?)lfrn3mzv.yfv(20,129):错误CS0246:类型或命名空间名称'找不到TACS'(您是否缺少using指令或汇编引用?)lfrn3mzv.yfv(20,80):错误CS0012:类型'Object'在未引用的程序集中定义 . 您必须添加对程序集'netstandard,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'的引用 . lfrn3mzv.yfv(23,67):错误CS1983:异步方法的返回类型必须为void,任务或任务lfrn3mzv.yfv(23,39):错误CS0400:找不到类型或命名空间名称'System'在全局命名空间中(你是否缺少...'_ AppCode_Mail_Notifications_SponsorReview_SFNegative_cshtml.ExecuteAsync()':并非所有代码路径都返回值lfrn3mzv.yfv(20,18):错误CS0518:未定义或导入预定义类型'System.Void' /AppCode/Mail/Notifications/_ViewImports.cshtml(1,7):错误CS0246:找不到类型或命名空间名称'TACS'(您是否缺少using指令或程序集引用?)/ AppCode / Mail / Notifications /SponsorReview/SFNegative.cshtml(4,92):错误CS0012:类型'对象'是在未引用的程序集中定义的 . 您必须添加对程序集'netstandard,Version = 2.0.0.0,Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'./AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92):error CS0518:预定义类型'System.Object'i未定义或导入/AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92):错误CS0518:未定义或导入预定义类型'System.Void'/AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml (6,38):错误CS0012:类型“对象”在未引用的程序集中定义 . 您必须添加对程序集'netstandard,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'的引用 . /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38):错误CS0518:未定义或导入预定义类型'System.Object'/AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38) :错误CS0518:未在Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler中的Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CompileAndEmit(RazorCodeDocument codeDocument,String generatedCode)中定义或导入预定义类型“System.Void” . Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CreateCacheEntry(String normalizedPath)中的CompileAndEmit(String relativePath)---从抛出异常的先前位置开始的堆栈跟踪---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()位于Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorPageFactoryProvider.CreateFactory(Stri)的System.Runtime.CompilerServices.TaskAwaiter1.GetResult()上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) ng relativePath)在Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.CreateCacheResult(HashSet1 expirationTokens,String relativePath,Boolean isMainPage)at atMicrosoft.AspNetCore.Mvc.Razor.RazorViewEngine.LocatePageFromPath(String executionFilePath,String pagePath,Boolean isMainPage)位于TACS.Web.AppCode的Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.GetView(String executionFilePath,String viewPath,Boolean isMainPage) . C:\ Projects \ Tacs \ TACS \ TACS.Web \ AppCode \ Mail \ ViewRenderService.cs中的Mail.ViewRenderService.d__4.MoveNext():第42行
1 回答
我要检查的第一件事是你的UnitTest项目将 identical net.core版本作为你的web项目 . 我这样说是因为即使找不到像
String
和Type
这样的核心类型 . 这告诉我,当在运行时编译时(这是razor所做的)它可以't find the core dlls for what it'试图编译 .您可能需要的第二件事是将您的UnitTest项目中的引用显式添加到剃刀页面所依赖的确切框架依赖项中 .
最后,可能是在运行时,您的Razor页面依赖于
web.config
中的条目来进行名称空间导入:在这种情况下,要使其在单元测试中工作,请尝试从web.config中删除这些行,并将导入添加到每个剃刀页面: