有没有办法在pester中模拟powershell的$ PSVersionTable变量

时间:2018-03-22 05:14:07

标签: powershell pester

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

这是我的代码:

Testcase.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变量,以便我可以检查它是否已被调用。

1 个答案:

答案 0 :(得分:2)

你不能模拟一个变量。但是,您可以将该变量作为函数返回的内容包装,然后模拟该函数。例如:

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的函数,它只用于返回$PSVersionTable。然后在Mock中,我们可以用具有PSVersion属性和指定版本的pscustomobject替换其通常的结果。我还为echo添加了一个模拟(请注意这是Write-Output的别名),以便您的Pester脚本还检查是否已调用此cmdlet(我们预期它会因为我们已修复)版本低于3)。

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