使用 Pester 对基于 Class 的 DSC 资源进行单元测试
Unit Testing a Class-based DSC resource with Pester
我在对基于 class 的 DSC 资源进行单元测试时遇到问题。我正在尝试模拟 class 中的几个函数,但出现了转换错误。
PSInvalidCastException: Cannot convert the "bool TestVMExists(string vmPath,
string vmName)" value of type "System.Management.Automation.PSMethod" to type
"System.Management.Automation.ScriptBlock".
我的测试代码是这样的:
using module 'C:\Program Files\WindowsPowerShell\Modules\xVMWareVM\xVMWareVM.psm1'
$resource = [xVMWareVM]::new()
Describe "Set" {
Context "If the VM does not exist" {
Mock xVMWareVM $resource.TestVMExists {return $false}
Mock xVMWareVM $resource.CreateVM
It "Calls Create VM once" {
Assert-MockCalled $resource.CreateVM -Times 1
}
}
}
有人知道如何实现吗?
提前致谢
您目前无法使用 Pester 模拟 class 函数。当前的解决方法是使用 Add-Member -MemberType ScriptMethod
来替换该函数。这意味着您将不会获得模拟断言。
我为了DockerDsc tests by @bgelens借了这个。
如果没有您的 class 代码,我无法对此进行测试,但它应该与上面的 @bgelens 代码一起为您提供思路。
using module 'C:\Program Files\WindowsPowerShell\Modules\xVMWareVM\xVMWareVM.psm1'
Describe "Set" {
Context "If the VM does not exist" {
$resource = [xVMWareVM]::new()
$global:CreateVmCalled = 0
$resource = $resource |
Add-Member -MemberType ScriptMethod -Name TestVMExists -Value {
return $false
} -Force -PassThru
$resource = $resource |
Add-Member -MemberType ScriptMethod -Name CreateVM -Value {
$global:CreateVmCalled ++
} -Force -PassThru
It "Calls Create VM once" {
$global:CreateVmCalled | should be 1
}
}
}
我在对基于 class 的 DSC 资源进行单元测试时遇到问题。我正在尝试模拟 class 中的几个函数,但出现了转换错误。
PSInvalidCastException: Cannot convert the "bool TestVMExists(string vmPath,
string vmName)" value of type "System.Management.Automation.PSMethod" to type
"System.Management.Automation.ScriptBlock".
我的测试代码是这样的:
using module 'C:\Program Files\WindowsPowerShell\Modules\xVMWareVM\xVMWareVM.psm1'
$resource = [xVMWareVM]::new()
Describe "Set" {
Context "If the VM does not exist" {
Mock xVMWareVM $resource.TestVMExists {return $false}
Mock xVMWareVM $resource.CreateVM
It "Calls Create VM once" {
Assert-MockCalled $resource.CreateVM -Times 1
}
}
}
有人知道如何实现吗?
提前致谢
您目前无法使用 Pester 模拟 class 函数。当前的解决方法是使用 Add-Member -MemberType ScriptMethod
来替换该函数。这意味着您将不会获得模拟断言。
我为了DockerDsc tests by @bgelens借了这个。
如果没有您的 class 代码,我无法对此进行测试,但它应该与上面的 @bgelens 代码一起为您提供思路。
using module 'C:\Program Files\WindowsPowerShell\Modules\xVMWareVM\xVMWareVM.psm1'
Describe "Set" {
Context "If the VM does not exist" {
$resource = [xVMWareVM]::new()
$global:CreateVmCalled = 0
$resource = $resource |
Add-Member -MemberType ScriptMethod -Name TestVMExists -Value {
return $false
} -Force -PassThru
$resource = $resource |
Add-Member -MemberType ScriptMethod -Name CreateVM -Value {
$global:CreateVmCalled ++
} -Force -PassThru
It "Calls Create VM once" {
$global:CreateVmCalled | should be 1
}
}
}