AspNetCore v2.0 - 在另一个项目中渲染razor-views以进行集成测试

时间:2017-12-04 11:59:07

标签: c# asp.net asp.net-core-mvc asp.net-core-2.0 razorengine

我想为我的网络应用程序编写集成测试。我使用Microsoft.AspNetCore.TestHost.TestServer通过url与控制器通信。但是无法呈现视图。作为回应,我收到错误消息:

  

缺少一个或多个编译引用。确保你的   项目正在引用' Microsoft.NET.Sdk.Web'和   ' PreserveCompilationContext' property未设置为false。

在我的.csproj中,我尝试更改Microsoft.NET.Sdk.Web上的project-sdk,我尝试添加<PreserveCompilationContext>true</PreserveCompilationContext>。另外,我尝试按照Microsoft-docs(here中的here)中的描述重写代码。 但我仍然有同样的错误信息。

重现步骤:

  • 创建测试项目&#34; WebApplication1.IntegrationTests&#34;。
  • 在WebApplication-project上添加引用。
  • 添加nuget-package&#34; Microsoft.AspNetCore.TestHost&#34;
  • 将获取请求发送至&#34; / Home / Index&#34;通过TestServer
  • 阅读带有错误消息的回复。

using WebApplication1;
using Microsoft.AspNetCore.TestHost; 
using System.Net.Http;
using System.Threading.Tasks;

namespace WebApplication1.IntegrationTests
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Path to contentRoot folder. 
            var contentRootPath = @"..\..\..\..\WebApplication1";

            var builder = new WebHostBuilder()
                .UseStartup<Startup>()
                .UseEnvironment(EnvironmentName.Development)
                .UseContentRoot(contentRootPath);           

            var server = new TestServer(builder);
            var client = server.CreateClient();            

            var response = client.GetAsync("/Home/Index").Result;
            var responseString = response.Content.ReadAsStringAsync().Result;
        }
    }
}

在浏览器中呈现responseStringenter image description here

2 个答案:

答案 0 :(得分:3)

为了最近测试ASP.NET Core 2.0应用程序,我不得不使用<PreserveCompilationContext>true</PreserveCompilationContext>属性更新集成测试项目的csproj文件,并使用其他目标来复制.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. Information 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>

您可以查看完整集成测试项目in github的源代码。可能存在其他差异,例如我使用了.UseContentRoot(path)方法的完整路径。

答案 1 :(得分:0)

如果你使用的是AspNetCore v2.0,你应该在你的程序文件中实例化你的webhost

public static IWebHost BuildWebHost(string[] args) { 
     return WebHost.CreateDefaultBuilder(args) //<-- See what this does 
            .UseStartup<Startup>()
            .Build();
    }

然后确保您的项目将preservecompilationcontext设置为true,就像您显而易见的那样。另外我假设您的目标是.Net 4.6.x运行时。