【问题标题】:PowerShell Module cannot be loaded when running Pester test in Visual Studio在 Visual Studio 中运行 Pester 测试时无法加载 PowerShell 模块
【发布时间】:2017-12-15 22:56:25
【问题描述】:

我创建了一个 PowerShell 测试脚本 Common.tests.ps1,使用 Pester 在同一目录中的 PowerShell 脚本 Common.ps1 中的一些函数。

在同一目录中还有一个TestInitializer.ps1 脚本,它使用Microsoft.Xrm.Data.PowerShell 模块在Dynamics CRM 实例中创建和获取记录。

从 Visual Studio 运行 PowerShell 测试脚本时,测试在测试资源管理器中失败并显示以下消息:

CommandNotFoundException:无法加载模块“Microsoft.Xrm.Data.PowerShell”。有关详细信息,请运行“Import-Module Microsoft.Xrm.Data.PowerShell”。

但是,从 PowerShell ISE 运行相同的测试时,运行没有问题。这似乎好像没有为 Visual Studio 运行的实例安装模块(我在运行 Get-Module -ListAvailable 并看到输出不包括用于 Visual Studio 测试的 Microsoft.Xrm.Data.PowerShell 模块时确认了这一点),不过即使像 Import-Module Microsoft.Xrm.Data.PowerShell -Global -Force 这样的显式调用似乎也不会在使用 Visual Studio 执行脚本期间加载模块。

这里是Common.test.ps1

$here = (Split-Path -Parent $MyInvocation.MyCommand.Path)
. $here\Common.ps1
. $here\TestInitializer.ps1

Describe "SelectionToSingleCharString" {
Context "StringTransforms" {
    It "Retrieves a CRM record and uses the optionset value to retrieve a single character" {
    SelectionToSingleCharString($crmRecord.new_type) | Should Be "I"
        }
    }
}

来自TestInitializer.ps1的片段:

# Whether or not this is uncommented does not matter
#Import-Module "$env:SystemRoot\System32\WindowsPowerShell\v1.0\Modules\Microsoft.Xrm.Data.PowerShell\Microsoft.Xrm.Data.PowerShell.psd1" -Global -Force

#$modules = Get-Module -ListAvailable
#Write-Host $modules

# Failing here
Microsoft.Xrm.Data.PowerShell\Connect-CrmOnPremDiscovery -ServerUrl $loginServerUrl -OrganizationName $loginOrgName -Credential $cred

我可以将测试设计为使用 Mock 而不是实际尝试创建/读取记录,但无法加载外部模块并在 Visual Studio 中运行会受到限制。

【问题讨论】:

    标签: powershell visual-studio-2015 pester


    【解决方案1】:

    关于模块安装目录(如果您对实际问题感兴趣,请跳过此部分):

    首先你不应该将模块安装到$PSHome\Modules (%Windir%\System32\WindowsPowerShell\v1.0\Modules)。此文件夹仅供 Windows 附带的模块使用。

    您应该始终在以下路径下安装仅供您的用户使用的模块:

    $Home\Documents\WindowsPowerShell\Modules 
    

    对于系统范围的安装:

    $Env:ProgramFiles\WindowsPowerShell\Modules
    

    关于在 PowerShell 中安装模块的进一步阅读可以是found on MSDN

    关于您的实际问题:

    您使用的是什么 Visual Studio 版本?我安装了 Visual Studio 2017 社区版,但无法重现您的错误。我的 PowerShell 也作为 64 位进程运行。您的 PowerShell 可以作为 32 位进程运行。对于 32 位 PowerShell,模块目录不同。这可以解释为什么您安装的模块没有显示在 Visual Studio 中。

    您可以使用以下命令验证您的 PowerShell 是否在 64 位进程中运行:

    PS> [Environment]::Is64BitProcess
    True
    

    要使 32 位 PowerShell 可以访问您的模块,您还需要将它们安装在以下路径下:

    {$Env:ProgramFiles(x86)}\WindowsPowerShell\Modules 
    

    【讨论】:

    • 这是在 Visual Studio 2015 中,是的,测试似乎是在 32 位进程中执行的。当我在 Windows PowerShell (x86) 环境中运行Install-Module Microsoft.Xrm.Data.PowerShell,并重新运行测试时,它成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多