集成测试ASP.NET Core与.NET Framework -找不到deps.json

byqmnocz  于 2023-10-21  发布在  .NET
关注(0)|答案(9)|浏览(194)

我有一个针对.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如果这有帮助。

3xiyfsfu

3xiyfsfu1#

我们应该从主项目中获取“Program”类,但它会自动引用Microsoft.AspNetCore.Mvc.Testing.Program

public class VersioningTests : IClassFixture<WebApplicationFactory<Program>>

这个代码必须引用我们的主程序代码。因此,我们必须在Program.cs文件的最后一行放置对Program类的引用:

public partial class Program { }
5tmbdcev

5tmbdcev2#

我刚刚遇到了同样的问题,发现根本原因是相当模糊的。在文档中,.deps文件 * 应该 * 复制到集成测试项目的bin目录中。这对我来说并没有发生,因为我没有从我的集成测试项目中 * 显式地 * 引用Microsoft.AspNetCore.Mvc.Testing包。我创建了一个共享库,其中包含一些引用该nuget包的实用函数,因此我的集成测试项目间接引用了它。
Microsoft.AspNetCore.Mvc.Testing包中有一些自定义构建任务,它们会为您复制引用的服务deps.json文件,因此您 * 必须 * 直接从集成测试项目中引用它,以便运行这些构建任务。

cczfrluj

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

esbemjvw

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.添加如下测试文件

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");
    }

}

1.运行测试项目

6tdlim6h

6tdlim6h5#

对我来说,我已经在我的测试项目中引用了Microsoft.AspNetCore.Mvc.Test,但是删除以下内容解决了这个问题:

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
juzqafwq

juzqafwq6#

对于那些试图在最小的API设置上从单元测试进行集成测试的人(例如):

[TestMethod]
public void Test()
{
    var application = new WebApplicationFactory<Program>().WithWebHostBuilder(builder =>{});
    var body = JsonSerializer.Serialize(request);
    var content = new StringContent(body, Encoding.UTF8, "application/json");
    var client = application.CreateClient();

    var response = client.PostAsync("myendpoint", content).Result;
}

您可以将应用程序Program(类)暴露给单元测试,添加Program分部类,如下所示(例如:Program.UnitTests.cs):

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("UnitTests")]

namespace API;

partial class Program {}

我花了一段时间才为最小的API设置找到正确的解决方案,所以我希望这可以避免其他人像我一样浪费很多时间寻找解决方案。我从以下来源获得了这些信息(如果您需要更多信息):How to test minimal APIs in ASP.NET Core 6

xlpyo6sf

xlpyo6sf7#

接受的答案假设deps.json文件存在于项目bin文件夹中,因此可以将其复制到集成测试bin文件夹中。
在我的情况下,deps.json文件在应用程序bin文件夹中丢失。在这种情况下,请确保
<PreserveCompilationContext>true</PreserveCompilationContext>
在您的csproj文件中。

kwvwclae

kwvwclae8#

我面临着同样的问题,我想与你分享一种方法,使它复制到下面发布:
找到.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>
91zkwejq

91zkwejq9#

我收到了同样的错误信息。
尝试将项目引用添加到SUT项目(我想要测试的项目)。
Project Referance in the solution explorer

相关问题