Могу ли я издеваться над функцией 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

Кроме того, насмешливое взаимодействие будет трудным, независимо от того, что вы делаете на самом деле.

Другие вопросы по тегам