如何在单元测试项目中编译剃刀视图

时间:2018-03-21 14:18:07

标签: razor asp.net-core .net-core mstest

我试图在单元测试项目中使用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}

1 个答案:

答案 0 :(得分:0)

我要检查的第一件事是你的UnitTest项目正在将相同的 net.core版本作为你的web项目。我这样说是因为即使找不到像StringType这样的核心类型。这告诉我,在运行时编译时(这是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 ....