модульные тесты ядра .net asp.net, которые зависят от файлов - appsettings.json - не проходят в travis

json asp.net-mvc nunit asp.net-core travis-ci

3704 просмотра

3 ответа

46 Репутация автора

Я создал ядро ​​asp.net dot net rtm (1.0.0-preview2-003121).

Он использует ConfigurationBuilder для генерации конфигурации из appsettings.json:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

    Configuration = builder.Build();
}

Я также пробовал '.SetBasePath (Directory.GetCurrentDirectory ()) `

Теперь мои юнит-тесты (в другом проекте) я создаю хост в памяти: я пытался:

_server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
_client = _server.CreateClient();

И я попробовал:

_server = new TestServer(
        new WebHostBuilder()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>());
_client = _server.CreateClient();

Мой файл Travis.yml довольно стандартный:

 install:
# Install .net using linux CLI commands
  - sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
  - sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
  - sudo apt-get update
  - sudo apt-get -qq install dotnet-dev-1.0.0-preview2-003121
  - sudo apt-get install dotnet-hostfxr-1.0.2

script:
  - dotnet restore
  - dotnet build src/Speakr.WebApp.Site
  - dotnet build tests/Speakr.WebApp.Site.Tests
  - dotnet test tests/Speakr.WebApp.Site.Tests -f netcoreapp1.0

Локально все работает и строит. И на Windows, и на Ubuntu. На travis CI tho я получаю следующую ошибку: Error : Speakr.WebApp.Site.Tests.InMemoryTests.HomeControllerIndexShouldNotBeNull

Кто-нибудь видел это? Я попытался добавить project.json в тестовый проект, включить CopyToOutput в основной проект и включить CopytoOutput в тестовый проект.

Нада! :(

Автор: jplebre Источник Размещён: 17.07.2016 11:21

Ответы (3)


3 плюса

49362 Репутация автора

Функциональные / интеграционные тесты MVC являются хорошим примером того, как вы можете это сделать.

MvcTestFixture : (обратите внимание, что 'contentRoot' рассчитывается) https://github.com/aspnet/Mvc/blob/1.0.0/test/Microsoft.AspNetCore.Mvc.FunctionalTests/MvcTestFixture.cs

Пример его использования в тесте : https://github.com/aspnet/Mvc/blob/1.0.0/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicTests.cs

Веб-сайт или приложение, с помощью которого проверяется вышеуказанный тест : https://github.com/aspnet/Mvc/tree/1.0.0/test/WebSites/BasicWebSite

Автор: Kiran Challa Размещён: 18.07.2016 03:47

3 плюса

1637 Репутация автора

Вы должны добавить

"buildOptions": { "copyToOutput": [ "appsettings.json" ] }

в ваш проект интеграционного тестирования project.json, тогда он .SetBasePath(env.ContentRootPath)будет работать, поскольку при запуске тестов appsettings.json будет находиться в \ test \ IntegrationTestsProject \ bin \ Debug \ netcoreapp1.1 - там, где его ищут при запуске.

Автор: arielorvits Размещён: 05.12.2016 07:34

1 плюс

788 Репутация автора

После серии попыток я нашел возможное решение. Так как мне нужна инициализация базы данных, я вывел основную Startup. Несколько виртуальных функций внутри TestStartupиспользуются для запуска базы данных. Затем я делаю Configurationвнутри основного Startupкласса защищенный набор. В заключение:

public TestStartup(IHostingEnvironment env) : base(env)
{
    string basePath = Directory.GetCurrentDirectory();
    if (!Directory.GetCurrentDirectory().EndsWith("IntegrationTest")) {
        basePath = Path.Combine(basePath, "MyProject.IntegrationTest");
    }

    var builder = new ConfigurationBuilder();
    builder.SetBasePath(basePath)
           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
           .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

Хотя basePathвыборка немного уродливая, это решение работает для меня.

Автор: holmescn Размещён: 28.12.2016 12:56
Вопросы из категории :
32x32