Тестирование класса сценариев 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