有没有办法用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
变量,以便我可以检查它是否已被调用。
答案 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
函数在此处提供的功能相同的功能。