Добавление модульных тестов в проект F # в VSCode

Я использую VSCode и набор пакетов Ionide для создания консольного приложения на F #. Мне нужно добавить модульные тесты в приложение, чтобы, когда я ctrl+shift+p FAKE: Build проект, тесты выполнялись в процессе сборки.

В качестве примера я создал фиктивный проект в Github.

Первоначально директории test там не было. Я создал test каталог и в этой папке создал второй проект TestProj.Test (задним числом я должен был использовать более описательные имена) для целей тестирования. Я добавил .fsproj файл из TestProj в этот проект, чтобы я мог ссылаться на SimpleFunctions.fs. NUnit.Framework и FsUnit добавляются к TestProj.Test. Test.fs содержит два простых теста.

Я намеренно создал TestProj.Test как F # library, потому что прочитал в SO, что проект тестирования должен быть библиотекой, а не консольным приложением.

Я добавил строки 9, 31–37 и 47 в build.fsx файл по умолчанию, который поступает из Ионид.. Однако, когда я создаю весь проект (т.е. TestProj), сборка не выполняется, и я получаю следующую ошибку:

  1) System.Exception: NUnit: cannot run tests (the assembly list is empty).
   at Fake.NUnitSequential.NUnit(FSharpFunc`2 setParams, IEnumerable`1 assemblies) in C:\code\fake\src\app\FakeLib\UnitTest\NUnit\Sequential.fs:line 22
   at [email protected](Unit _arg3)
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\fake\src\app\FakeLib\TargetHelper.fs:line 492

Строка 22 Sequential.fs предполагает, что assemblies пусто.

Что я делаю неправильно? Как мне настроить файл build.fsx, чтобы тесты в TestProj.test выполнялись успешно? Или что-то не так с файлом Tests.fs в TestProj.Test? Это кажется особенно трудным; есть ли более простой способ включить тесты, которые запускаются автоматически с VSCode, Iondide и F#?


person Steven    schedule 26.10.2016    source источник
comment
Ваша цель «Test» ищет «NUnit.Test. *. Dll», тогда как «TestProj.Test» создает dll с таким же именем. Кстати, есть еще несколько возможных улучшений в структуре вашего проекта. Если хотите, я бы поднял пиар EOD WEST.   -  person CaringDev    schedule 27.10.2016
comment
Для создания полноценного проекта F #, включая документацию, вы можете взглянуть на ProjectScaffold   -  person CaringDev    schedule 27.10.2016
comment
Раньше я использовал ProjectScaffold, но в него включено так много вещей, которые мне не нужны или которые я не понимаю. Я надеялся избежать этого, но могу прибегнуть к его использованию, если не смогу самостоятельно запустить и запустить среду тестирования. Кроме того, возможно, для меня это слишком рано, но я не понимаю аббревиатуры PR, EOD и WEST, как вы их здесь использовали. Объяснение пожалуйста?   -  person Steven    schedule 27.10.2016
comment
Извините за эту стену сокращений :-) PR = P ull R equest для вашего репозитория, EOD = End Of Day, WEST = West European Summer Time. Но помог ли ответ?   -  person CaringDev    schedule 27.10.2016
comment
Ваш комментарий помог минимально, но это потому, что я не понимаю, как все части сочетаются друг с другом! Также да, PR был бы полезен!   -  person Steven    schedule 27.10.2016
comment
создал PR, как обещал   -  person CaringDev    schedule 28.10.2016


Ответы (1)


В вашем проекте есть несколько проблем:

  • пытается протестировать перед сборкой "Clean" ==> "Test" ==> "Build" ==> "Deploy"
    => изменить целевые зависимости на "Clean" ==> "Build" ==> "Test" ==> "Deploy"

  • отдельная конфигурация пакета для теста (paket.dependencies, paket.lock в подпапке test), что приводит к несовместимым версиям зависимостей, на которые есть ссылки
    => удалить paket.dependencies и paket.lock из test

  • ядовитая смесь версий NUnit
    => удалите явные ссылки на NUnit.Framework из paket.dependencies и запустите paket.exe install

  • недопустимое расширение типа в тестовом проекте
    => изменить на type Test() или удалить ненужный файл

  • Building создает вывод всех проектов (а не только src/app) в ./build, но тесты ищут библиотеки DLL в ./test
    => изменить шаблон тестового файла на buildDir + "**/*.Test.dll"

  • если вы хотите использовать NUnit3
    => open Fake.Testing и использовать NUnit3 вместо NUnit

наконец, вы должны зафиксировать paket.bootstrapper.exe

Я рекомендую вам либо использовать предопределенный шаблон, либо начать с малого и убедиться, что вы понимаете каждый шаг, и убедитесь, что он работает должным образом. Как только вы перейдете к нерабочему решению, очень сложно вернуться в нужное русло.

person CaringDev    schedule 28.10.2016