我有一个针对.NET Framework 4.7的ASP.NET Core Web API项目,我正在尝试为其编写集成测试。我使用Visual Studio Add new project和Unit Test Project(.NET Framework)模板创建了一个单元测试项目。我将Microsoft.AspNetCore.Mvc.Testing NuGet包添加到测试项目中,并进行了以下测试:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestRepro.Tests
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public async Task TestMethod1()
{
var factory = new WebApplicationFactory<Startup>();
var client = factory.CreateClient();
var response = await client.GetAsync("/api/values");
}
}
}
但这会引发以下异常:
测试方法TestRepro.Tests.UnitTest1.TestMethod1引发异常:System.InvalidOperationException:找不到“[path removed]\TestRepro.Tests\bin\TestRepro.deps. json”。此文件是正常运行功能测试所必需的。源项目bin文件夹中应该有该文件的副本。如果不是这种情况,请确保在项目文件上将PreserveCompilationContext属性设置为true。例如,“true”。要使功能测试工作,它们需要从构建输出文件夹运行,或者必须将应用程序输出目录中的TestRepro.deps.json文件复制到测试运行所在的文件夹中。此错误的常见原因是在测试运行时启用了卷影复制。
我已经验证了TestRepro.deps.json存在于Web应用程序输出文件夹(TestRepro\bin\base\net47)中,但它没有被复制到测试项目输出文件夹(TestRepro.Tests\bin\base47)中。而且我还没能找到如何禁用阴影复制。
**编辑:**文档说:
Microsoft.AspNetCore.Mvc.Testing包处理以下任务:将依赖文件(*.deps)从SUT复制到测试项目的bin文件夹中。
但这似乎不起作用。我可以手动复制文件,但这在自动构建场景中不起作用。一种方法是在TeamCity中进行构建步骤,但感觉很粗糙。有什么想法吗?
我有a repro on GitHub如果这有帮助。
9条答案
按热度按时间3xiyfsfu1#
我们应该从主项目中获取“Program”类,但它会自动引用
Microsoft.AspNetCore.Mvc.Testing.Program
类这个代码必须引用我们的主程序代码。因此,我们必须在Program.cs文件的最后一行放置对Program类的引用:
5tmbdcev2#
我刚刚遇到了同样的问题,发现根本原因是相当模糊的。在文档中,
.deps
文件 * 应该 * 复制到集成测试项目的bin目录中。这对我来说并没有发生,因为我没有从我的集成测试项目中 * 显式地 * 引用Microsoft.AspNetCore.Mvc.Testing
包。我创建了一个共享库,其中包含一些引用该nuget包的实用函数,因此我的集成测试项目间接引用了它。在
Microsoft.AspNetCore.Mvc.Testing
包中有一些自定义构建任务,它们会为您复制引用的服务deps.json
文件,因此您 * 必须 * 直接从集成测试项目中引用它,以便运行这些构建任务。cczfrluj3#
好吧,在花了将近两个小时试图解决这个问题之后...我知道了
我的问题是我使用了新的.NET6最小API Program.cs格式,它没有定义Program类(也没有命名空间),我在
WebApplicationFactory<Program>
定义中引用了错误的类。它来自Microsoft.VisualStudio.TestPlatfrom.TestHost
(严重WTF),所以你需要做的是:1.使用您自己的实际Program.cs,这样您就可以向Minimal APIs Program.cs文件添加一个名称空间,并创建一个带有Main方法的实际Program类。
1.现在您可以引用适当的Program类作为WebApplicationFactory的泛型类型
1.确保您在Web应用程序项目中使内部可见,以便您可以公开Program类(如果您将其标记为内部)。
这基本上是对Ahmets回答的补充:https://stackoverflow.com/a/70490057/1534753
esbemjvw4#
按照下面的步骤创建Asp.NetCore的集成测试,目标是net 47。
1.创建
New Project-> xUnit Test Project(.Net Core)
1.右键单击新建项目->编辑.csproj->将
TargetFramework
更改为net47
1.将项目引用添加到
TestRepro
1.安装包
Microsoft.AspNetCore.Mvc.Testing
1.添加如下测试文件
1.运行测试项目
6tdlim6h5#
对我来说,我已经在我的测试项目中引用了
Microsoft.AspNetCore.Mvc.Test
,但是删除以下内容解决了这个问题:juzqafwq6#
对于那些试图在最小的API设置上从单元测试进行集成测试的人(例如):
您可以将应用程序Program(类)暴露给单元测试,添加Program分部类,如下所示(例如:Program.UnitTests.cs):
我花了一段时间才为最小的API设置找到正确的解决方案,所以我希望这可以避免其他人像我一样浪费很多时间寻找解决方案。我从以下来源获得了这些信息(如果您需要更多信息):How to test minimal APIs in ASP.NET Core 6
xlpyo6sf7#
接受的答案假设deps.json文件存在于项目bin文件夹中,因此可以将其复制到集成测试bin文件夹中。
在我的情况下,deps.json文件在应用程序bin文件夹中丢失。在这种情况下,请确保
<PreserveCompilationContext>true</PreserveCompilationContext>
在您的csproj文件中。
kwvwclae8#
我面临着同样的问题,我想与你分享一种方法,使它复制到下面发布:
找到.csprj测试文件添加以下代码将帮助您通过。
p/s我正在使用.net core 3.1,所以它对.net core test prj很有用。
91zkwejq9#
我收到了同样的错误信息。
尝试将项目引用添加到SUT项目(我想要测试的项目)。
Project Referance in the solution explorer