我可以模拟 DllImport-ed 函数吗?
Can I mock a DllImport-ed function?
假设我有一个添加自定义类型的 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() 以便 return 测试数据而不是调用我的本机 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.4.0\Functions\Mock.ps1: line 801
[13352] at Mock, C:\Program Files\WindowsPowerShell\Modules\Pester.4.0\Functions\Mock.ps1: line 168
是不是在我的模块中找不到模拟目标的问题,因为它是动态添加的?还是我只是做错了(最有可能的情况)?
假设您使用的是 5.1,您可以创建一个模拟 class:
class Native {
static [int] GetLogs() {
return 5
}
}
然后您可以调用:
[Native]::GetLogs()
# => 5
顺便说一句,无论您真正做什么,模拟互操作都会很困难。
假设我有一个添加自定义类型的 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() 以便 return 测试数据而不是调用我的本机 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.4.0\Functions\Mock.ps1: line 801
[13352] at Mock, C:\Program Files\WindowsPowerShell\Modules\Pester.4.0\Functions\Mock.ps1: line 168
是不是在我的模块中找不到模拟目标的问题,因为它是动态添加的?还是我只是做错了(最有可能的情况)?
假设您使用的是 5.1,您可以创建一个模拟 class:
class Native {
static [int] GetLogs() {
return 5
}
}
然后您可以调用:
[Native]::GetLogs()
# => 5
顺便说一句,无论您真正做什么,模拟互操作都会很困难。