Powershell 如何为任务序列变量设置编写Pester模拟

Powershell 如何为任务序列变量设置编写Pester模拟,powershell,pester,Powershell,Pester,我正在为任务序列期间使用的PowerShell脚本编写Pester测试。其中有几个是处理任务序列变量的,所以我编写了一个mock,它允许测试读取变量,现在我正试图找出如何编写变量。 这是读取任务序列变量的代码: $TsEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment $Value = $TsEnv.Value('VariableNameToRead') $TsEnv = New-Object -COMObject Microsoft

我正在为任务序列期间使用的PowerShell脚本编写Pester测试。其中有几个是处理任务序列变量的,所以我编写了一个mock,它允许测试读取变量,现在我正试图找出如何编写变量。 这是读取任务序列变量的代码:

$TsEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment
$Value = $TsEnv.Value('VariableNameToRead')
$TsEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment
$TsEnv.Value('VariableNameToWrite') = 'ValueToWrite'
通过将
$TsEnv
传递给一个函数,我可以用以下内容模拟它:

$TsEnv = @{
    'VariableNameToRead' = 'TestValue'
}
Add-Member -InputObject $TsEnv -MemberType ScriptMethod -Name Value -Value {
    Param( [String]$Key )
    $This[$Key]
} 
这是用于编写任务序列变量的代码:

$TsEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment
$Value = $TsEnv.Value('VariableNameToRead')
$TsEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment
$TsEnv.Value('VariableNameToWrite') = 'ValueToWrite'

由于它位于
$TsEnv.Value
后面的括号中,我认为它是在将其视为一种方法,但我找不到任何关于如何为方法赋值的示例。

使用Pester 4.3.3+,您可能可以使用创建该COM对象的可用模拟

或者,您可以执行类似于下面的操作,以允许您模拟COM对象的功能

如果COM对象在您的CI运行的机器上可用,我可能会考虑跳过模拟和写集成测试。

#functions.ps1
设置StrictMode-最新版本
$ErrorActionPreference=“停止”;
函数GetTaskSequenceValue(
[参数(必需=$true)]
[字符串]$varNameToRead,
[参数(必需=$false)]
[System.Management.Automation.ScriptBlock]$readAction={
参数([string]$readKey)
$tsEnv=新对象-com对象“Microsoft.SMS.TSEnvironment”
$tsEnv.Value($readKey)
}
) {
$value=Invoke命令`
-ScriptBlock$readAction`
-ArgumentList@($varNameToRead)
返回$value
}
函数SetTaskSequenceValue(
[参数(必需=$true)]
[字符串]$varNameToWrite,
[参数(必需=$false)]
[System.Management.Automation.ScriptBlock]$writeAction={
参数([string]$writeKey,[string]$value)
$tsEnv=新对象-com对象“Microsoft.SMS.TSEnvironment”
$TsEnv.Value($writeKey)=$Value
}    
) {    
试一试{
调用命令`
-ScriptBlock$writeAction`
-ArgumentList@($varNameToWrite)
返回$true
}
抓住{
#吞下去
}
返回$false
}
abov功能测试。这些测试手动模拟COM对象

#functions.test.ps1
$here=拆分路径-父级$MyInvocation.MyCommand.Path
$sut=(拆分路径-Leaf$MyInvocation.MyCommand.Path)-替换“\.Tests\”,”
. “$here\$sut”
设置StrictMode-最新版本
$ErrorActionPreference=“停止”;
描述“GetTaskSequenceValue”{
它“获取期望值”{
$expected='value'
$mockAction={
参数($dummy)
返回“值”
}
$actual=GetTaskSequenceValue`
-varNameToRead'dummyName'`
-readAction$mockAction
$actual |应为$expected
}
}
描述“SetTaskSequenceValue”{
它“设置期望值”{
$expected='value'
$mockAction={
参数($dummy)
返回“值”
}
$actual=SetTaskSequenceValue`
-varNameToWrite“dummyValue”`
-writeAction$mockAction
$actual |应为$true
}
}

使用Pester 4.3.3+,您可以使用创建该COM对象的可用模拟

或者,您可以执行类似于下面的操作,以允许您模拟COM对象的功能

如果COM对象在您的CI运行的机器上可用,我可能会考虑跳过模拟和写集成测试。

#functions.ps1
设置StrictMode-最新版本
$ErrorActionPreference=“停止”;
函数GetTaskSequenceValue(
[参数(必需=$true)]
[字符串]$varNameToRead,
[参数(必需=$false)]
[System.Management.Automation.ScriptBlock]$readAction={
参数([string]$readKey)
$tsEnv=新对象-com对象“Microsoft.SMS.TSEnvironment”
$tsEnv.Value($readKey)
}
) {
$value=Invoke命令`
-ScriptBlock$readAction`
-ArgumentList@($varNameToRead)
返回$value
}
函数SetTaskSequenceValue(
[参数(必需=$true)]
[字符串]$varNameToWrite,
[参数(必需=$false)]
[System.Management.Automation.ScriptBlock]$writeAction={
参数([string]$writeKey,[string]$value)
$tsEnv=新对象-com对象“Microsoft.SMS.TSEnvironment”
$TsEnv.Value($writeKey)=$Value
}    
) {    
试一试{
调用命令`
-ScriptBlock$writeAction`
-ArgumentList@($varNameToWrite)
返回$true
}
抓住{
#吞下去
}
返回$false
}
abov功能测试。这些测试手动模拟COM对象

#functions.test.ps1
$here=拆分路径-父级$MyInvocation.MyCommand.Path
$sut=(拆分路径-Leaf$MyInvocation.MyCommand.Path)-替换“\.Tests\”,”
. “$here\$sut”
设置StrictMode-最新版本
$ErrorActionPreference=“停止”;
描述“GetTaskSequenceValue”{
它“获取期望值”{
$expected='value'
$mockAction={
参数($dummy)
返回“值”
}
$actual=GetTaskSequenceValue`
-varNameToRead'dummyName'`
-readAction$mockAction
$actual |应为$expected
}
}
描述“SetTaskSequenceValue”{
它“设置期望值”{
$expected='value'
$mockAction={
参数($dummy)
返回“值”
}
$actual=SetTaskSequenceValue`
-varNameToWrite“dummyValue”`
-writeAction$mockAction
$actual |应为$true
}
}

要处理获取环境变量、WMI或dotnet静态方法调用的任何问题,我想继续