Тестирование класса сценариев PowerShell DSC с помощью pester - Невозможно найти тип [ClassName]

Я пытаюсь протестировать некоторые пользовательские ресурсы DSC, написанные в виде класса, с помощью pester. Однако я изо всех сил пытаюсь выяснить, как сделать класс доступным для другого файла. Это на самом деле не проблема, я не могу сделать это и в PowerShell. У меня есть модуль с классом в нем очень похоже на следующее в файле SxDeployment.psm1

[DscResource()]
class SxWindowsService {
    [void]Set(){
    }
    [bool]Test(){
        return $true;
    }
    [SxWindowsService]Get(){
        return $this
    }
}

Этот модуль имеет соответствующий.psd1, который перечисляет класс SxWindowsService как "DscResourcesToExport". Он регистрируется как модуль, я вижу этот модуль, когда выполняю Get-Module -ListAvailable, а также могу выполнить Import-Module для него.

Я предполагаю, что мой вопрос действительно заключается в том, как я могу создать ссылку на этот класс из другого файла?

Скажем, у меня есть другой файл test.ps1 со следующим

Import-Module SxDeployment

$class = [SxWindowsService]::new()

Я получаю следующую ошибку: "Невозможно найти тип [SxWindowsService]".

ОБНОВЛЕНИЕ После небольшого изменения я могу создать экземпляр класса, изменив файл.psm1 на файл.ps и изменив оператор import-module для. .\SxDeployment.ps1. Таким образом, кажется, проблема в том, как вы потребляете ресурсы, определенные в файле модуля ресурсов DSC вне конфигурации DSC?

1 ответ

Решение

Литерал типа [SxWindowsService] не будет доступен вне модуля. Это по замыслу. Вот цитата из примечаний к выпуску:

Ключевое слово класса >>> Определяет новый класс. Это настоящий тип.NET Framework. Члены класса являются общедоступными, но только открытыми в рамках модуля. Вы не можете ссылаться на имя типа как строку (например, New-Object не работает), и в этом выпуске вы не можете использовать литерал типа (например, [MyClass]) вне скрипта / файл модуля, в котором определяется класс.

Редактировать:

Хорошо после сказанного выше. Поскольку существует некоторое несоответствие между активацией объекта в.NET и PowerShell, то я подумал, что может быть просто выход. И я нашел это:

Import-Module C:\ps\Stackru\32743812\issue.psm1 -Force
function New-PSClassInstance {
    param(
        [Parameter(Mandatory)]
        [String]$TypeName,
        [object[]]$ArgumentList = $null
    )
    $ts = [System.AppDomain]::CurrentDomain.GetAssemblies() |
        Where-Object Location -eq $null | 
            Foreach-Object {
                $_.Gettypes()
            } | Where-Object name -eq $TypeName |
                Select-Object -Last 1
    if($ts) {
        [System.Activator]::CreateInstance($ts,$ArgumentList )
    } else {
        $typeException = New-Object TypeLoadException $TypeName        
        $typeException.Data.Add("ArgumentList",$ArgumentList)
        throw $typeException
    }
}
New-PSClassinstance -TypeName SxWindowsService
Другие вопросы по тегам