Как вы unit test контроллер или основной объект ASP.NET Core?

Я пытаюсь получить классы С# для контроллера, модели и репозитория (доступа к данным) под unit test, в Visual Studio 2015, с ASP.NET Core MVC (ASP.NET 5 во время предварительного просмотра, теперь называемого ASP.NET Core).

У меня есть следующая структура:

   Solution
       |
      src
       | 
       |-- ITConsole       <- main app (ASP.NET MVC, DNX 4.5.1)
       | 
       `-- ITConsoleTests  <- What kind of project should this be?

MainApp использует DNX 4.5.1, но кажется, что если я создам стандартное приложение nUnit Unit test, оно будет доступно только как классическая библиотека классов .NET Framework, нацеленная на .NET Framework 4.5.2, а не как Библиотека веб-класса, которая может работать с моим основным приложением.

Итак, на всякий случай он может работать как классический .NET framework. Проект framework (.net assembly). Я попытался вручную найти и добавить ссылки (путем добавления ссылки и просмотра), чтобы получить .NET. зависимости для решения. Я знаю, что ссылки на сборку .NET печально не транзитивны. Поэтому, если у UnitTest.dll есть ссылка на MainApp.dll, а MainApp.dll зависит от ASP.NET MVC и всего остального, от которого это зависит, я должен сделать это сам. Это то, что я пытаюсь сделать. Я добавил ссылку на C:\dev\Demo\ITConsole\artifacts\bin\ITConsole\Debug\dnx451\ITConsole.dll в мой проект Unit test, чтобы я мог начать компилировать код. Классы Unit test компилируются, но они не запускаются, вероятно, из-за беспорядка попытки добавить ссылку на ASP.NET.

Прямо сейчас, хотя я добавил ссылку на Common.Logging.Core и Common.Logging, когда я нажимаю "Запустить все" в тестовом проводнике, я получаю эту ошибку:

Test Name:  TestStudyLogReadDocument
Test FullName:  ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument
Test Source:    C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs : line 52
Test Outcome:   Failed
Test Duration:  0:00:00.0712058

Result StackTrace:  
at Couchbase.Configuration.Client.ClientConfiguration..ctor()
   at ITConsole.Repository.StudyLogRepository..ctor() in C:\dev\Demo\ITConsole\src\ITConsole\Repository\StudyLogRepository.cs:line 39
   at ITConsoleTests.ITConsoleTestStudyLog.SetupDb() in C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs:line 30
   at ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument() in C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs:line 53
Result Message: 
Test method ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument threw exception: 
System.IO.FileLoadException: Could not load file or assembly 'Common.Logging.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e' or one of its dependencies. The located assembly manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

(В то время, когда задавался этот вопрос...) Ни один из шаблонов предварительного просмотра asp.net 5 mvc не может генерировать для вас модульные тесты. Можете ли вы даже Unit test блестящее новое приложение ASP.NET Core? См. Снимок экрана ниже, например, о том, как обычный способ, которым вы начинаете модульное тестирование, недоступен в VS 2015 с использованием MSTEST.

no  Unit test для вас

Ответ 1

UPDATE: XUnit по-прежнему отличная идея, но этот ответ устарел сейчас, потому что вы можете также использовать "стандартный" MSTEST, если хотите с ASP.NET ядро. (1 июня 2016 года) Я считаю, что по-прежнему предпочитаю XUnit, но это ваш звонок.

САМЫЙ ПОСЛЕДНИЙ ИНСТРУКЦИИ XUNIT LINK: Отличные инструкции, которые могут быть обновлены чаще, чем этот ответ, найдены в вики xUnit.

IDE WORKAROUND: вручную найдите и удалите %TEMP%\VisualStudioTestExplorerExtensions, когда Visual Studio пойдет глупо и не будет "обнаруживать" и показывать ваши тесты.

По состоянию на май 2016 года, когда ASP.NET Core 1.0 RC1 недавно перешел на RC2, по-прежнему не представляется возможным использовать стандартную инфраструктуру Microsoft Unit Test с ASP.NET Core (ранее ASP.NET 5) и XUnit представляется хорошим выбором для RC1 и RC2.

Вы можете получить модульное тестирование XUnit.net для работы с ASP.NET Core 1.0.0-RC1, используя официальные инструкции] 2 в проект XUnit github, который имеет конкретный "запуск ядра .net".

Вы также можете установить Шаблон нового проекта XUnit, который предоставляет шаблонный проект Unit Test для регулярного полного ядра .net и .net. Нажмите "Сервис", а затем "Расширения и обновления" введите в XUnit и найдите xUnit Test Project TEMPLATE и установите TEMPLATE. НЕ УСТАНАВЛИВАЙТЕ ЛЮБОГО ИСПЫТАТЕЛЬНОГО ИСПЫТАНИЯ XUNIT, ВАМ НЕ НУЖНО.

Я создал рабочий образец и загрузил его в битбакет:

https://bitbucket.org/wpostma/aspnet5mvc6xunitdemo

Если у вас нет mercurial, вы можете скачать zip из битбакет.

Демонстрация включает в себя один тест, который проходит, и один тест, который терпит неудачу.

Краткое описание:

  • У вас есть Visual Studio 2015, включая Update2 и инструменты "1.0.0 preview" (последняя по состоянию на май 2016 года).

  • Создайте библиотеку веб-классов НЕ a Unit Test Project.

  • Добавьте ссылки XUnit на него и исправьте ваш project.json(пример ниже).

  • Напишите свой класс (пример ниже).

  • Запустите тесты с помощью Test Explorer внутри ide или вне ide, введите dnx . tests и проверьте вывод (пример ниже).

project.json для 1.0.0-rc2 со ссылкой на демонстрационную сборку и xunit:

 {
  "version": "1.0.0-*",

  "testRunner": "xunit",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002702",
      "type": "platform"
    },

    "dotnet-test-xunit": "1.0.0-rc2-*",

    "xunit": "2.1.0",


    "YetAnotherWebbyDemo": "1.0.0-*"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "dnxcore50",
        "portable-net45+win8"
      ]
    }
  }
}

Unit test class (whatever.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using Xunit;

using YetAnotherWebbyDemo.Models;

namespace YetAnotherWebbyDemoTests
{
    // This project can output the Class library as a NuGet Package.
    // To enable this option, right-click on the project and select the Properties menu item. In the Build tab select "Produce outputs on build".
    public class TestBasics
    {
        [Fact]
        public void TestAdd()
        {

            TestableModelClass TestMe = new TestableModelClass();


            Assert.True(TestMe.Add(3, 2) == 5, "Basic Math Failure");

            Assert.True(TestMe.Add(-3, -2) == -5, "Basic Math Failure");
        }

    }
}

Пример вывода из командной строки в RC1, когда мы использовали dnx:

C:\dev\Demo\YetAnotherWebbyDemo\src\YetAnotherWebbyDemoTests>dnx . test

xUnit.net DNX Runner (32-bit DNX 4.5.1)
  Discovering: YetAnotherWebbyDemoTests
  Discovered:  YetAnotherWebbyDemoTests
  Starting:    YetAnotherWebbyDemoTests
    YetAnotherWebbyDemoTests.TestBasics.TestAdd [FAIL]
      Basic Math Failure
      Expected: True
      Actual:   False
      Stack Trace:
        YetAnotherWebbyDemoTestBasics.cs(25,0): at YetAnotherWebbyDemoTests.Test
Basics.TestAdd()
  Finished:    YetAnotherWebbyDemoTests
=== TEST EXECUTION SUMMARY ===
   YetAnotherWebbyDemoTests  Total: 1, Errors: 0, Failed: 1, Skipped: 0, Time: 0.263s

Пример вывода в RC2, где мы используем dotnet:

D:\dev\aspnet5mvc6xunitdemo\src\YetAnotherWebbyDemoTests>dotnet test
Project YetAnotherWebbyDemo (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Project YetAnotherWebbyDemoTests (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
xUnit.net .NET CLI test runner (64-bit win10-x64)
  Discovering: YetAnotherWebbyDemoTests
  Discovered:  YetAnotherWebbyDemoTests
  Starting:    YetAnotherWebbyDemoTests
    YetAnotherWebbyDemoTests.TestBasics.TestAdd [FAIL]
      Basic Math Failure
      Expected: True
      Actual:   False
      Stack Trace:
        D:\dev\aspnet5mvc6xunitdemo\src\YetAnotherWebbyDemoTests\YetAnotherWebbyDemoTestBasics.cs(26,0): at YetAnotherWebbyDemoTests.TestBasics.TestAdd()
  Finished:    YetAnotherWebbyDemoTests
=== TEST EXECUTION SUMMARY ===
   YetAnotherWebbyDemoTests  Total: 1, Errors: 0, Failed: 1, Skipped: 0, Time: 0.205s
SUMMARY: Total: 1 targets, Passed: 0, Failed: 1.

Ответ 2

Команда XUnit отлично справляется с обновлением своей документации.

Чтобы информация всегда обновлялась, обратитесь к документации Xunit по адресу:

http://xunit.github.io/docs/getting-started-dotnet-core.html

Ответ 3

С выпуском RC2 интеграция Xunit больше не работала с моими проектами (теперь это исправлено, см. комментарии). Чтобы проверить свои проекты, я переключился на NUnit. Он, похоже, поддерживает RC2 и имеет легкий тест-сервер NUnitLite.

В основном вам нужно разместить NUnitLite в консольном приложении и запустить его с помощью "прогона в сети".

Добавьте следующие зависимости:

"dependencies": {
"NUnit": "3.2.1",
"NUnitLite": "3.2.1",

Чтобы запустить тестовый бегун, вам нужно добавить этот код в файл program.cs:

public class Program
{
    public static void Main(string[] args)
    {
        new AutoRun().Execute(args);
    }
}