有什么方法可以在 pester 中模拟 powershell 的 $PSVersionTable 变量

Is there any way to mock $PSVersionTable variable of powershell in pester

有没有办法用 Pester 模拟 PowerShell 的 $PSVersionTable 变量?

这是我的代码:

测试用例。ps1:

trap [Exception] {
    write-error $("TRAPPED: " + $_)
    exit 1
    }

function Check_Powershell_Version

{
    $PSVersion = $PSVersionTable.PSVersion.Major

if ($PSVersion -lt 3){
    echo "Current version is not compatible. Please upgrade powershell"
    }
}

Testcase.Tests.ps1:

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here$sut"

Describe "SRP testing" {
    It "Check Powershell Version" {

    Mock $PSVersionTable {
                return{ @{ PSVersion = [Version]'1.0.0' } }
    }

    Check_Powershell_Version

    Assert-MockCalled $PSVersionTable -Times 1        
    }
    }

我想模拟 $PSVersionTable 变量,以便我可以检查它是否已被调用。

您不能 Mock 变量。但是,您可以将该变量 returns 包装为一个函数,然后模拟该函数。例如:

function Get-PSVersion { $PSVersionTable }

function Check_Powershell_Version
{
    $PSVersion = (Get-PSVersion).PSVersion.Major

    if ($PSVersion -lt 3){
        echo 'Current version is not compatible. Please upgrade powershell'
    }
}

Describe 'SRP testing' {
    It 'Check Powershell Version' {

        Mock Get-PSVersion {
            [pscustomobject]@{ PSVersion = [Version]'1.0.0' }
        }

        Mock echo { }

        Check_Powershell_Version

        Assert-MockCalled Get-PSVersion -Times 1
        Assert-MockCalled echo -Times 1
    }
}

我已经声明了一个名为 Get-PSVersion 的函数,它只是用于 return $PSVersionTable。然后在 Mock 中,我们可以用具有 PSVersion 属性 和指定版本的 pscustomobject 替换其通常的结果。我还为 echo 添加了一个 Mock(请注意这是 Write-Output 的别名),这样您的 Pester 脚本也会检查是否调用了此 cmdlet(我们希望如此,因为我们已经修复了版本小于 3).

另外,仅供参考,您可以在模块或脚本的顶部使用 #Requires -Version 3.0 语句来获得与此处提供的 Check_PowerShell_Version 函数相同的功能。