Тесты PowerShell в TravisCI не пройдены из-за отсутствия обязательных модулей - PullRequest
0 голосов
/ 23 января 2019

Я играю с powershell и запускаю тест локально и на TravisCI.

Манифест модуля

RequiredModules = @('ClipboardText')

Travis Config

В настоящее время я устанавливаю powershell и pester до запуска моих тестов

addons:
  apt:
    sources:
      - sourceline: deb [arch=amd64] https://packages.microsoft.com/ubuntu/14.04/prod trusty main
        key_url: https://packages.microsoft.com/keys/microsoft.asc
    packages:
      - powershell
      - xclip
before_script:
  - pwsh -Command 'Install-Module -Name Pester -Force -Scope CurrentUser'
script:
  - make test

Makefile

test:
    pwsh -Command 'Get-childItem -Recurse *.test.ps1 | foreach { Invoke-Pester -EnableExit $$_ }'

Travis Build

Build выдает ошибку:

Import-Module : The required module 'ClipboardText' is not loaded. 
Load the module or remove the module from 'RequiredModules' in the file '/home/travis/build/edouard-lopez/lesspass-powershell/lesspass.psd1'.
At /home/travis/build/edouard-lopez/lesspass-powershell/Clipboard.test.ps1:1 char:1
+ Import-Module $PSScriptRoot/lesspass.psd1 -Force  # force code to be  ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (/home/travis/bu...l/lesspass.psd1:String) [Import-Module], MissingMemberException
+ FullyQualifiedErrorId : Modules_InvalidManifest,Microsoft.PowerShell.Commands.ImportModuleCommand

Вопрос

Я думалэто объявление RequiredModules установит ClipboardText, что позволит правильно выполнить мой тест.Если я вручную устанавливаю модуль ClipboardText локально, мой тест работает, но правильно ли это делать на CI и в будущем распространении моего модуля?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Согласно другому ответу, поле RequiredModules манифеста модуля определяет любые модули, которые должны быть импортированы в глобальную среду, до импорта этого модуля.

Поэтому эти модули должны быть уже установлены насистемы, но не нужно загружать (импортировать) в текущий сеанс.

В результате, чтобы убедиться, что ваши тесты работают в системе CI, вам необходимо убедиться, что ваш тестовый скрипт выполнил установкуиз необходимых модулей (например, через Install-Module, если они доступны в PSGallery или другом репозитории nuget).

Если есть возможность протестировать ваш скрипт без зависимого модуля, вы можете написать сценарии Pester, которые работают вокругпроблема путем пересмешивания требуемых функций без необходимости присутствия модуля.Это можно сделать, определив пустые функции для отсутствующих командлетов, а затем (опционально) объявив для них макеты, чтобы можно было проверить, что они были вызваны, как и ожидалось:

. YourModule.psm1

Function Some-Function { }

Mock Some-Function { }

Describe 'Testing Invoke-SomeCmdlet invokes Some-Function as part of its code' {

    $Result = Invoke-SomeCmdlet

    It 'Should invoke Some-Function' {
        Assert-MockCalled Some-Function
    }
}

Без объявления командлета какпустой Function Mock потерпит неудачу, так как вы можете только смоделировать существующий командлет / функцию.

Обратите внимание, что для того, чтобы протестировать свой код таким образом, вам нужно загрузить код, не вызываяМанифест модуля (например, исходный файл .ps1 или .psm1 file / s напрямую сравнивается с загрузкой модуля через .psd1, в противном случае оператор RequiredModules вызовет сбой тестового сценария).

Очевидно, что его прощепросто имейте все необходимые модули, но иногда это не всегда возможно, приведенное выше просто для демонстрации того, как можно обойти такой сценарий.

0 голосов
/ 25 января 2019

Как описано Mark Wragg и Dejulia489 , вам необходимо установить модуль перед импортом it.

.travis.yml

Добавьте ClipboardText в список модулей для установки:

before_script:
 - pwsh -Command 'Install-Module -Name Pester,ClipboardText -Force -Scope CurrentUser'
0 голосов
/ 24 января 2019

Необходимые модули Powershell должны быть загружены в глобальную среду перед импортом корневого модуля.- Документация по модулю Powershell

Модули, которые необходимо импортировать в глобальную среду перед импортом этого модуля RequiredModules = @ ()

Убедитесь, что в ClipboardText установленодин из путей, перечисленных в $ Env: PSModulePath.Вы можете сделать это, открыв сеанс powershell на сервере Travis Build и запустив

Import-Module 'ClipboardText'

Если это не удастся, вам необходимо правильно установить модуль clipboardtest.

...