【问题标题】:Powershell tests in TravisCI fail due to missing RequiredModulesTravisCI 中的 Powershell 测试因缺少 RequiredModules 而失败
【发布时间】:2019-01-23 19:45:56
【问题描述】:

我正在使用 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 $$_ }'

特拉维斯构建

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

【问题讨论】:

  • 它会加载模块,但不会安装它。机器上已经安装了吗?如果是,请检查模块的安装路径。它应该位于适用于所有用户的全球位置。

标签: powershell continuous-integration travis-ci pester import-module


【解决方案1】:

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

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

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

如果可以在没有依赖模块的情况下测试您的脚本,您可以编写 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 语句会导致测试脚本失败)。

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

【讨论】:

    【解决方案2】:

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

    .travis.yml

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

    before_script:
     - pwsh -Command 'Install-Module -Name Pester,ClipboardText -Force -Scope CurrentUser'
    

    【讨论】:

      【解决方案3】:

      在导入根模块之前,必须将 Powershell 所需模块加载到全局环境中。 - Powershell Module Manifest documentation

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

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

      Import-Module 'ClipboardText'
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        相关资源
        最近更新 更多