使用 .NET Framework 集成测试 ASP.NET Core - 找不到 deps.json
Posted
技术标签:
【中文标题】使用 .NET Framework 集成测试 ASP.NET Core - 找不到 deps.json【英文标题】:Integration testing ASP.NET Core with .NET Framework - can't find deps.json 【发布时间】:2019-03-12 22:08:05 【问题描述】:我有一个面向 .NET Framework 4.7 的 ASP.NET Core Web API 项目,我正在尝试为其编写集成测试。我使用 Visual Studio 添加新项目和单元测试项目 (.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:找不到'[路径已删除]\TestRepro.Tests\bin\Debug\TestRepro.deps.json'。此文件是功能测试正常运行所必需的。您的源项目 bin 文件夹中应该有该文件的副本。如果不是这种情况,请确保在项目文件中将属性 PreserveCompilationContext 设置为 true。例如“真实”。为了使功能测试正常工作,它们需要从构建输出文件夹运行,或者必须将应用程序输出目录中的 TestRepro.deps.json 文件复制到运行测试的文件夹中。此错误的常见原因是在测试运行时启用了卷影复制。
我已验证 Web 应用程序输出文件夹 (TestRepro\bin\Debug\net47) 中存在 TestRepro.deps.json,但它没有复制到测试项目输出文件夹 (TestRepro.Tests\bin\Debug)。而且我还没有找到如何禁用卷影复制。
编辑: The documentation 说:
Microsoft.AspNetCore.Mvc.Testing 包处理以下任务:将依赖项文件 (*.deps) 从 SUT 复制到测试项目的 bin 文件夹中。
但这似乎不起作用。我可以手动复制文件,但这在自动构建场景中不起作用。一种方法是在 TeamCity 中进行构建步骤,但感觉很粗糙。有什么想法吗?
如果有帮助,我有 a repro on GitHub。
【问题讨论】:
【参考方案1】:我刚刚遇到了同样的问题,发现根本原因非常模糊。从the documentation,.deps
文件应该被复制到集成测试项目的 bin 目录。这对我来说没有发生,因为没有明确从我的集成测试项目中引用Microsoft.AspNetCore.Mvc.Testing
包。我创建了一个共享库,其中包含一些引用该 nuget 包的实用程序函数,因此我的集成测试项目间接引用了它。
Microsoft.AspNetCore.Mvc.Testing
包中有一些自定义构建任务会为您复制引用的服务 deps.json
文件,因此您必须直接从集成测试项目中引用它以获取这些构建要运行的任务。
【讨论】:
如果您遇到与上面列出的相同的问题并使用 .net 核心,则此答案中描述的解决方案正是您所需要的。我在集成测试项目中也忘记了这一点。非常感谢您的回答@TylerOhlsen。 这也是我的解决方案。测试一直在进行,直到我创建了一个共享库并重构了重复的依赖项。单元测试项目必须引用Microsoft.AspNetCore.Mvc.Test
以使带有 deps.json 的 voodoo 发生。【参考方案2】:
按照以下步骤为 Asp.Net Core 创建集成测试,目标为 net 47。
-
创建
New Project-> xUnit Test Project(.Net Core)
右键新建项目->编辑.csproj->将TargetFramework
改为net47
将项目引用添加到TestRepro
安装包Microsoft.AspNetCore.Mvc.Testing
添加如下测试文件
public class BasicTests
: IClassFixture<WebApplicationFactory<Startup>>
private readonly WebApplicationFactory<Startup> _factory;
public BasicTests(WebApplicationFactory<Startup> factory)
_factory = factory;
[Fact]
public async Task TestMethod1()
var client = _factory.CreateClient();
var response = await client.GetAsync("/api/values");
运行测试项目
【讨论】:
是的,这确实有效!但我不明白为什么。是因为它最初是一个 .NET Core 项目,然后被重新定位?还是因为它使用的是 xUnit 而不是 MSTest 框架? @HenrikOlsson 我认为它与MSTest
有关。对于文档,它与 xunit 测试一起使用。
不,不是-我只是尝试以与您的答案相同的方式创建一个 MSTest 项目,并且效果也很好。所以我的结论是,你必须从目标 .Net Core 开始,然后改变目标。
当我想定位 .net 核心时,这并没有解决我的问题。我该怎么办?
@SamuelJ 我的回答能解决你的问题吗?【参考方案3】:
对我来说,我已经在我的测试项目中引用了Microsoft.AspNetCore.Mvc.Test
,但删除以下内容解决了这个问题:
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
【讨论】:
这在升级到 .NET 5.0 时基本上为我修复了它,这很奇怪。但是我有一个共享的程序集信息,所以我删除了该行并将其替换为:我在 .NET Core 6 中进行集成测试时遇到了同样的错误。
对于集成,我们应该从主项目中获取“程序”类,但它会自动引用Microsoft.AspNetCore.Mvc.Testing.Program
类
public class VersioningTests : IClassFixture<WebApplicationFactory<Program>>
此代码必须引用我们的主程序代码。所以我们必须把 Program 类的引用放在 Program.cs 文件的最后一行:
public partial class Program
【讨论】:
Damian Edward 在 Github 中有一个示例项目,关于 .NET 6 中的集成/单元测试,使用最少的 API,他公开了 Program 类。参考她github.com/DamianEdwards/MinimalApiPlayground/blob/main/src/…【参考方案5】:接受的答案假定 deps.json 文件存在于您的项目 bin 文件夹中,因此可以将其复制到集成测试 bin 文件夹中。 在我的情况下,应用程序 bin 文件夹中缺少 deps.json 文件。 在这种情况下,请确保您有
<PreserveCompilationContext>true</PreserveCompilationContext>
在您的 csproj 文件中。
【讨论】:
【参考方案6】:我也遇到了同样的问题,想跟大家分享一下复制到下面发布的方法:
找到 .csprj 测试文件 添加以下代码将帮助您通过。
p/s 我使用的是 .net core 3.1,所以它对 .net core test prj 很有用。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<Target Name="CopyDepsJsonFiles" AfterTargets="Publish">
<ItemGroup>
<DepsJsonFiles Include="$(TargetDir)*.deps.json" />
</ItemGroup>
<Copy SourceFiles="@(DepsJsonFiles)" DestinationFolder="$(PublishDir)" />
</Target>
<!-- ... other elements-->
</Project>
【讨论】:
以上是关于使用 .NET Framework 集成测试 ASP.NET Core - 找不到 deps.json的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 的 NUnit Entity Framework 集成测试依赖注入问题
使用 ASP.NET Core 和 Entity Framework Core 进行集成测试 - 如何在每次测试时恢复数据库中的测试数据?
如何使用 Entity Framework Code First V6.1.2 进行集成测试
万网虚拟主机版本 .NET Framework V2.0/V3.0/V3.5(经典) .NET Framework V2.0/V3.0/V3.5(集成) 有啥区别