微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – ASP.NET Core TestServer为Razor视图生成HTTP 500

当我使用TestServer调用MVC端点来检查视图呈现时,它会导致HTTP 500内部服务器错误响应.

错误是:

An error occurred during the compilation of a resource required to process this request. Please review the following specific error details and modify your source code appropriately.

/CustomSubfolder/Views/_ViewImports.cshtml

One or more compilation references are missing. Possible causes include a missing ‘preserveCompilationContext’ property under ‘buildOptions’ in the application’s project.json.

The type or namespace name ‘MyNamespace’ does not exist in the namespace
‘Company.App’ (are you missing an assembly reference?)

测试代码

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace MvcProject.Tests
{
    [TestClass]
    public class ControllerTests
    {
        protected TestServer Server { get; }
        protected HttpClient Client { get; }

        public ControllerTests()
        {
            Server = new TestServer(new WebHostBuilder()
                .UseContentRoot("../../../../MvcProject")
                .UseStartup<Startup>());
            Client = Server.CreateClient();
        }

        [TestMethod]
        public async Task Action_Valid_Renders()
        {
            HttpResponseMessage response = await Client.GetAsync("http://localhost/");

            Assert.AreEqual(HttpStatusCode.OK,response.StatusCode);
        }
    }
}

我正在使用面向.NET Framework 4.6.1的ASP.NET Core 1.1,我的MSTest .csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <packagereference Include="Microsoft.AspNetCore.TestHost" Version="1.1.3" />
    <packagereference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
    <packagereference Include="MSTest.TestAdapter" Version="1.1.18" />
    <packagereference Include="MSTest.TestFramework" Version="1.1.18" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\MvcProject\MvcProject.csproj" />
  </ItemGroup>

</Project>

解决方法

正如 https://github.com/aspnet/Razor/issues/1212中所解释的,问题是Razor视图编译所需的.deps.json文件不会自动复制到测试项目的输出中.

您可以将以下手动构建步骤添加到测试项目以解决该问题.

<!--
    Work around https://github.com/NuGet/Home/issues/4412. MVC uses DependencyContext.Load() which looks next to a .dll
    for a .deps.json. @R_422_4045@ion isn't available elsewhere. Need the .deps.json file for all web site applications.
  -->
  <Target Name="copyDepsFiles" AfterTargets="Build" Condition="'$(TargetFramework)'!=''">
    <ItemGroup>
      <DepsFilePaths Include="$([System.IO.Path]::ChangeExtension('%(_ResolvedProjectReferencePaths.FullPath)','.deps.json'))" />
    </ItemGroup>
    <copy SourceFiles="%(DepsFilePaths.FullPath)" DestinationFolder="$(OutputPath)" Condition="Exists('%(DepsFilePaths.FullPath)')" />
  </Target>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐