0

我正在powershell本地和 TravisCI 上玩并运行我的测试。

模块清单

RequiredModules = @('ClipboardText')

特拉维斯配置

目前我安装powershellpester在运行我的测试之前

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

生成文件

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

特拉维斯构建

构建抛出错误:

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 和模块的未来分发上做正确的事情吗?

4

3 回答 3

2

根据另一个答案,RequiredModules模块清单的字段定义了在导入此模块之前必须导入全局环境的任何模块。

因此,这些模块必须已经安装在系统上,但不需要加载(导入)到当前会话中。

因此,为了确保您的测试在 CI 系统上运行,您需要确保您的测试脚本执行了所需模块的安装(例如,Install-Module如果它们在 PSGallery 或其他 nuget 存储库中可用)。

如果可以在没有依赖模块的情况下测试您的脚本,您可以编写 Pester 脚本来解决该问题,方法是在不需要模块的情况下模拟所需的功能。这可以通过为缺少的 cmdlet 定义空函数然后(可选地)为它们声明模拟来完成,以便您可以验证它们是否已按预期调用:

. 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
    }
}

如果不将 cmdlet 声明为空FunctionMock则会失败,因为您只能模拟存在的 cmdlet/函数。

请注意,为了以这种方式测试您的代码,您需要在不调用模块清单的情况下加载代码(例如,点源 .ps1 或 .psm1 文件/s 直接与通过 .psd1 加载模块,否则RequiredModules语句将导致测试脚本失败)。

显然,只存在任何必需的模块会更简单,但有时这可能并不总是可能的,以上只是为了演示如何解决这种情况。

于 2019-01-24T14:25:55.130 回答
2

正如Mark WraggDejulia489的回答所描述的,您需要在导入模块之前安装它。

.travis.yml

添加ClipboardText到要安装的模块列表:

before_script:
 - pwsh -Command 'Install-Module -Name Pester,ClipboardText -Force -Scope CurrentUser'
于 2019-01-25T08:58:20.093 回答
1

在导入根模块之前,必须将 Powershell 所需的模块加载到全局环境中。- Powershell 模块清单文档

在导入此模块之前必须导入到全局环境中的模块RequiredModules = @()

确认“ClipboardText”安装在 $Env:PSModulePath 中列出的路径之一中。您可以通过在 Travis Build 服务器上打开一个 powershell 会话并运行

Import-Module 'ClipboardText'

如果失败,您将需要正确安装剪贴板测试模块。

于 2019-01-23T23:23:33.837 回答