Могу ли я издеваться над функцией DllImport?
Предположим, у меня есть скрипт 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 ответ
Решение
Предполагая, что вы используете 5.1, вы можете создать фиктивный класс:
class Native {
static [int] GetLogs() {
return 5
}
}
Который вы могли бы затем вызвать:
[Native]::GetLogs()
# => 5
Кроме того, насмешливое взаимодействие будет трудным, независимо от того, что вы делаете на самом деле.