我可以模拟DllImport导入的函数吗?

时间:2018-07-19 22:35:00

标签: powershell pester

假设我有一个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

是不是因为它是动态添加的,所以在我的模块中找不到模拟目标的问题?还是我只是做错了(最有可能的情况)?

1 个答案:

答案 0 :(得分:1)

假设您使用的是5.1版本,则可以创建一个模拟类:

class Native {
    static [int] GetLogs() {
        return 5
    }
}

然后您可以调用:

[Native]::GetLogs()
# => 5

顺便说一句,无论您做什么,模拟互操作都是困难的。