假设我有一个Powershell脚本,它添加了一个自定义类型,例如:
Add-Type -TypeDefinition @'
public struct LogEntry {
//...
}
public static class Native
{
[DllImport("some.dll", EntryPoint = "GetLogs")]
public static extern UInt32 GetLogs([Out] LogEntry[] results);
}
'@
我可以模拟此GetLogs()以便返回测试数据而不是调用本机DLL吗?
InModuleScope "mod.psd1" {
Describe "Process logs" {
Context "Function Exists" {
//failed: Mock [Native]::GetLogs { return 5 } -Verifiable
//failed: Mock [Native] -member GetLogs { return 5 } -Verifiable
It "Should work" {
[Native]::GetLogs | should be 5
}
}
}
}
我得到了此错误的变体(第一个语法抱怨[Native] :: GetLogs,第二个语法抱怨[Native]。
[-] Error occurred in Context block 3.13s
[13352] CommandNotFoundException: Could not find Command [Native]
[13352] at Validate-Command, C:\Program Files\WindowsPowerShell\Modules\Pester\3.4.0\Functions\Mock.ps1: line 801
[13352] at Mock, C:\Program Files\WindowsPowerShell\Modules\Pester\3.4.0\Functions\Mock.ps1: line 168
是不是因为它是动态添加的,所以在我的模块中找不到模拟目标的问题?还是我只是做错了(最有可能的情况)?
答案 0 :(得分:1)
假设您使用的是5.1版本,则可以创建一个模拟类:
class Native {
static [int] GetLogs() {
return 5
}
}
然后您可以调用:
[Native]::GetLogs()
# => 5
顺便说一句,无论您做什么,模拟互操作都是困难的。