2

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

这是我的代码:

测试用例.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"
    }
}

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

4

1 回答 1

4

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

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

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

于 2018-03-22T08:17:37.067 回答