首页 文章

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

提问于
浏览
1

我正在尝试在单元测试项目中使用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 回答

  • 0

    我要检查的第一件事是你的UnitTest项目将 identical net.core版本作为你的web项目 . 我这样说是因为即使找不到像 StringType 这样的核心类型 . 这告诉我,当在运行时编译时(这是razor所做的)它可以't find the core dlls for what it'试图编译 .

    您可能需要的第二件事是将您的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 ....
    

相关问题