【问题标题】:How to compile razor views in unit test project如何在单元测试项目中编译剃刀视图
【发布时间】:2018-08-30 17:12:25
【问题描述】:

我正在尝试在单元测试项目中使用RazorViewToStringRenderer。但是,当我调用它时,我收到了与 razor 编译相关的错误:

缺少一个或多个编译参考。确保您的项目正在引用“Microsoft.NET.Sdk.Web”并且“PreserveCompilationContext”属性未设置为 false。

.cshtml 文件作为嵌入式资源和单元测试项目引用包含在测试项目中来自单元测试项目:

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): error CS0012:“属性”类型是在未定义的程序集中定义的 参考。您必须添加对程序集“netstandard”的引用, 版本=2.0.0.0,文化=中性,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: 找不到类型或命名空间名称“系统”(是 您缺少 using 指令或程序集引用?) lfrn3mzv.yfv(14,36):错误 CS0234:类型或命名空间名称 命名空间中不存在“ViewFeatures” 'Microsoft.AspNetCore.Mvc'(您是否缺少程序集参考?) lfrn3mzv.yfv(20,129):错误 CS0246:类型或命名空间名称“TACS” 找不到(您是否缺少 using 指令或程序集 参考?)lfrn3mzv.yfv(20,80):错误CS0012:“对象”类型是 在未引用的程序集中定义。您必须添加一个 参考程序集 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'。 lfrn3mzv.yfv(23,67):错误 CS1983: 异步方法的返回类型必须为 void、Task 或 Task lfrn3mzv.yfv(23,39):错误 CS0400:类型或命名空间名称“系统” 在全局命名空间中找不到(您是否缺少...

'_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”的引用, 版本=2.0.0.0,文化=中性,PublicKeyToken=cc7b13ffcd2ddd51'。 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92): 错误 CS0518:未定义预定义类型“System.Object”或 进口的 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(4,92): 错误 CS0518:未定义或导入预定义类型“System.Void” /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38): 错误 CS0012:“对象”类型是在未定义的程序集中定义的 参考。您必须添加对程序集“netstandard”的引用, 版本=2.0.0.0,文化=中性,PublicKeyToken=cc7b13ffcd2ddd51'。 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38): 错误 CS0518:未定义预定义类型“System.Object”或 进口的 /AppCode/Mail/Notifications/SponsorReview/SFNegative.cshtml(6,38): 错误 CS0518:未定义或导入预定义类型“System.Void” 在 Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CompileAndEmit(RazorCodeDocument codeDocument, String generatedCode) 在 Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CompileAndEmit(字符串 相对路径)在 Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler.CreateCacheEntry(字符串 标准化路径) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorPageFactoryProvider.CreateFactory(String relativePath) at Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.CreateCacheResult(HashSet1 expireTokens, String relativePath, Boolean isMainPage) 在 Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.LocatePageFromPath(字符串 执行文件路径,字符串 pagePath,布尔值 isMainPage)在 Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.GetView(字符串 执行文件路径、字符串视图路径、布尔值 isMainPage)在 TACS.Web.AppCode.Mail.ViewRenderService.d__4.MoveNext() 在 C:\Projects\Tacs\TACS\TACS.Web\AppCode\Mail\ViewRenderService.cs:line 42}

【问题讨论】:

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


【解决方案1】:

我要检查的第一件事是您的 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 ....

【讨论】:

  • 我比较了项目和测试项目的 csproj 文件和项目属性,但没有发现任何差异。另外,是asp net core,不是asp.net
猜你喜欢
  • 2011-11-01
  • 2016-01-30
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2019-02-17
  • 2023-03-18
相关资源
最近更新 更多