有什么方法可以在 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
函数相同的功能。
有没有办法用 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
函数相同的功能。