我试图在单元测试项目中使用RazorViewToStringRenderer。但是,当我调用它时,我收到与剃刀编译相关的错误:
缺少一个或多个编译引用。确保您的项目引用了Microsoft.NET.Sdk.Web'和' PreserveCompilationContext' property未设置为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:类型&#39;属性&#39;在一个不是的程序集中定义 引用。您必须添加对assembly&net; netstandard的引用, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51&#39;。 lfrn3mzv.yfv(4,81):错误CS0518:预定义类型&#39; System.String&#39;是 未定义或导入lfrn3mzv.yfv(4,145):错误CS0518:预定义 键入&#39; System.Type&#39;未定义或导入lfrn3mzv.yfv(4,11): lfrn3mzv.yfv(11,11):错误 CS0246:类型或命名空间名称&#39;系统&#39;无法找到(是 你错过了using指令或程序集引用?) lfrn3mzv.yfv(14,36):错误CS0234:类型或命名空间名称 &#39; ViewFeatures&#39;在命名空间中不存在 &#39; Microsoft.AspNetCore.Mvc&#39; (你错过了一个程序集引用吗?) lfrn3mzv.yfv(20,129):错误CS0246:类型或命名空间名称&#39; TACS&#39; 无法找到(您是否错过了使用指令或程序集 引用?)lfrn3mzv.yfv(20,80):错误CS0012:类型&#39;对象&#39;是 在未引用的程序集中定义。你必须添加一个 参考汇编&#39; netstandard,Version = 2.0.0.0,Culture = neutral, 公钥= cc7b13ffcd2ddd51&#39 ;. lfrn3mzv.yfv(23,67):错误CS1983: 异步方法的返回类型必须为void,Task或Task lfrn3mzv.yfv(23,39):错误CS0400:类型或命名空间名称&#39;系统&#39; 在全局命名空间中找不到(你错过了......
&#39; _AppCode_Mail_Notifications_SponsorReview_SFNegative_cshtml.ExecuteAsync()&#39 ;: 并非所有代码路径都返回值lfrn3mzv.yfv(20,18):错误CS0518: 预定义类型&#39; System.Void&#39;未定义或导入 /AppCode/Mail/Notifications/_ViewImports.cshtml(1,7):错误CS0246: 类型或命名空间名称&#39; TACS&#39;无法找到(你错过了吗? using指令或程序集引用?) /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92): 错误CS0012:类型&#39;对象&#39;在一个不是的程序集中定义 引用。您必须添加对assembly&net; netstandard的引用, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51&#39;。 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92): 错误CS0518:预定义类型&#39; System.Object&#39;没有定义或 进口 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92): 错误CS0518:预定义类型&#39; System.Void&#39;未定义或导入 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38): 错误CS0012:类型&#39;对象&#39;在一个不是的程序集中定义 引用。您必须添加对assembly&net; netstandard的引用, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51&#39;。 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38): 错误CS0518:预定义类型&#39; System.Object&#39;没有定义或 进口 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38): 错误CS0518:预定义类型&#39; System.Void&#39;未定义或导入 在 Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CompileAndEmit(RazorCodeDocument codeDocument,String generatedCode)at Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CompileAndEmit(字符串 relativePath)at Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CreateCacheEntry(字符串 normalizedPath) ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() at Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorPageFactoryProvider.CreateFactory(String relativePath) at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.CreateCacheResult(HashSet
1 expirationTokens,String relativePath,Boolean isMainPage)at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.LocatePageFromPath(字符串 executionFilePath,String pagePath,Boolean isMainPage)at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.GetView(字符串 executionFilePath,String viewPath,Boolean isMainPage)at TACS.Web.AppCode.Mail.ViewRenderService.d__4.MoveNext() 在 C:\项目\ TACS \ TACS \ TACS.Web \ AppCode \邮件\ ViewRenderService.cs:行 42}
答案 0 :(得分:0)
我要检查的第一件事是你的UnitTest项目正在将相同的 net.core版本作为你的web项目。我这样说是因为即使找不到像String
和Type
这样的核心类型。这告诉我,在运行时编译时(这是razor所做的),它无法找到它试图编译的核心dll。
您可能需要的第二件事是将您的UnitTest项目中的引用显式添加到您的剃刀页面所依赖的完全框架依赖项。
最后,可能是在运行时你的Razor页面依赖于web.config
中的条目来进行命名空间导入:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="A line each for all my other namespaces ..." />
<add namespace="A line each for all my other namespaces ..." />
<add namespace="A line each for all my other namespaces ..." />
</namespaces>
</pages>
</system.web.webPages.razor>
在这种情况下,要使其在单元测试中工作,请尝试从web.config中删除这些行并将导入添加到每个剃刀页面:
@import Microsoft.NET.Sdk.Web
@import ....