Интеграционное тестирование ASP.NET Core с .NET Framework — не удается найти deps.json

У меня есть проект ASP.NET Core Web API, ориентированный на .NET Framework 4.7, для которого я пытаюсь написать интеграционные тесты. Я создал проект модульного тестирования с помощью 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");
        }
    }
}

Но это вызывает следующее исключение:

Test method TestRepro.Tests.UnitTest1.TestMethod1 threw exception: System.InvalidOperationException: Can't find'[path removed]\TestRepro.Tests\bin\Debug\TestRepro.deps.json'. This file is required for functional tests to run properly. There should be a copy of the file on your source project bin folder. If that is not the case, make sure that the property PreserveCompilationContext is set to true on your project file. E.g 'true'. For functional tests to work they need to either run from the build output folder or the TestRepro.deps.json file from your application's output directory must be copied to the folder where the tests are running on. A common cause for this error is having shadow copying enabled when the tests run.

Я убедился, что TestRepro.deps.json существует в выходной папке веб-приложения (TestRepro\bin\Debug\net47), но не копируется в выходную папку тестового проекта (TestRepro.Tests\bin\Debug). А как отключить теневое копирование я так и не нашел.

Редактировать:Документация говорит:

The Microsoft.AspNetCore.Mvc.Testing package handles the following tasks: Copies the dependencies file (*.deps) from the SUT into the test project's bin folder.

Но это, кажется, не работает. Я могу скопировать файл вручную, но это не работает в сценарии автоматической сборки. Один из способов — это сделать шаг сборки в TeamCity, но это кажется грубым. Есть идеи?

У меня есть репродукция на GitHub, если это поможет.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
7 410
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Выполните следующие действия, чтобы создать интеграционный тест для Asp.Net Core с нацеливанием на сеть 47.

  1. Создать New Project-> xUnit Test Project(.Net Core)
  2. Щелкните правой кнопкой мыши новый проект->Редактировать .csproj->Изменить TargetFramework на net47
  3. Добавить ссылку на проект в TestRepro
  4. Установочный пакет Microsoft.AspNetCore.Mvc.Testing
  5. Добавьте тестовый файл, как показано ниже.

    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");
        }
    
    }
    
  6. Запустить тестовый проект

Да, это действительно работает! Но я не понимаю, почему. Это потому, что он начинался как проект .NET Core, а затем был переориентирован? Или это потому, что он использует xUnit, а не MSTest framework?

Henrik Olsson 13.03.2019 08:44

@HenrikOlsson Я предполагаю, что это связано с MSTest. Для документа он используется с тестом xunit.

Edward 14.03.2019 03:56

Нет, это не так - я просто попытался создать проект MSTest так же, как в вашем ответе, и это тоже сработало. Итак, мой вывод таков, что вы должны начать с целевого .Net Core, а затем изменить его.

Henrik Olsson 14.03.2019 08:24

Это не решило мою проблему, когда я хочу настроить таргетинг на ядро ​​.net. Что я должен делать?

dcdgo 18.12.2019 05:04

@SamuelJ мой ответ решает вашу проблему?

TylerOhlsen 04.01.2020 01:01

Да оказывается так. Спасибо @TylerOhlsen и Хенрику Олссону за вашу неустанную поддержку.

dcdgo 04.01.2020 02:09

Обратите внимание, что это работает, только если вы выберете Microsoft.AspNetCore.Mvc.Testing версию 2.x.y. Версия 3.0.0 и выше работают только на ядре dotnet.

Dax Fohl 24.06.2020 05:06

Я только что столкнулся с этой же проблемой и обнаружил, что основная причина довольно неясна. Из документация.deps файлы должен копируются в каталог bin проекта интеграционного теста. Этого не происходило со мной, потому что явно не ссылался на пакет Microsoft.AspNetCore.Mvc.Testing из моего проекта интеграционного тестирования. Я создал общую библиотеку с некоторыми служебными функциями, которые ссылались на этот пакет nuget, поэтому мой проект интеграционного тестирования косвенно ссылался на него.

В пакете Microsoft.AspNetCore.Mvc.Testing есть несколько настраиваемых задач сборки, которые копируют файлы службы deps.json, на которую указывает ссылка, поэтому вы должен ссылаетесь на нее непосредственно из проекта интеграционного тестирования, чтобы запустить эти задачи сборки.

Если вы столкнулись с той же проблемой, что и перечисленная выше, и используете ядро ​​​​.net, решение, описанное в этом ответе, — это именно то, что вам нужно. Я тоже забыл об этом в своем проекте интеграционного тестирования. Большое спасибо за ваш ответ @TylerOhlsen.

RooKie- 27.09.2020 12:06

Это было решением и для меня. Тесты работали, пока я не создал общую библиотеку и не провел рефакторинг дублирующихся зависимостей. Ссылка проекта должен модульного тестирования Microsoft.AspNetCore.Mvc.Test для вуду с deps.json.

Mashton 04.11.2020 13:19

Что касается меня, у меня уже была ссылка на Microsoft.AspNetCore.Mvc.Test в моем тестовом проекте, но удаление следующего устранило проблему:

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>

Это по существу исправило это для меня при обновлении до .NET 5.0, что странно. Но у меня есть общая информация о сборке, поэтому я удалил эту строку и заменил ее на: GenerateAssemblyInformationVersionAttribute>false</GenerateAssemblyInformatio‌​nalVersionAttribute> <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVer‌​sionAttribute>

bkaid 03.12.2020 20:55

Принятый ответ предполагает, что файл deps.json существует в папке bin вашего проекта, поэтому его можно скопировать в папку bin теста интеграции. В моем случае файл deps.json отсутствовал в папке bin приложения. В этом случае убедитесь, что у вас есть

<PreserveCompilationContext>true</PreserveCompilationContext>

в вашем файле csproj.

Я столкнулся с той же проблемой, и я хочу поделиться с вами способом сделать копию для публикации ниже:

Найдите тестовый файл .csprj Добавьте следующий код, который поможет вам пройти.

p/s Я использую .net core 3.1, так что это было бы полезно для тестового проекта .net core.

   <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 Core 6.

Для интеграции мы должны получить класс «Программа» из основного проекта, но он автоматически ссылается на класс Microsoft.AspNetCore.Mvc.Testing.Program

public class VersioningTests : IClassFixture<WebApplicationFactory<Program>>

этот код должен ссылаться на наш основной программный код. Поэтому мы должны поместить ссылку на класс Program в последнюю строку файла Program.cs:

public partial class Program { }

В Github есть пример проекта Дамиана Эдварда об интеграции / модульных тестах в .NET 6 с минимальным API, и он делает класс Program общедоступным. Ссылка на нее github.com/DamianEdwards/MinimalApiPlayground/blob/main/src/‌​…

krlosmederos 29.12.2021 20:22

Другие вопросы по теме