【问题标题】:Testing a powershell DSC script class with pester - Unable to find type [ClassName]使用 pester 测试 powershell DSC 脚本类 - 找不到类型 [ClassName]
【发布时间】:2015-09-23 15:35:47
【问题描述】:

我正在尝试在 Pester 的帮助下测试一些作为类编写的自定义 DSC 资源。但是,我正在努力研究如何使该类可用于不同的文件。这真的不是一个麻烦的问题,我也不能在 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 语句更改为 .psm1 文件来创建该类的实例。 .\SxDeployment.ps1。所以看起来问题是如何使用 DSC 配置之外的 DSC 资源模块文件中定义的资源?

【问题讨论】:

    标签: powershell dsc pester


    【解决方案1】:

    类型文字 [SxWindowsService] 将无法在模块外部访问。这是设计使然。以下是发行说明中的​​引述:

    类关键字 >>> 定义一个新类。这是真正的 .NET Framework 类型。 类成员是公共的,但仅在模块范围内是公共的。您不能将类型名称引用为字符串(例如,New-Object 不起作用),并且在此版本中,您不能在外部使用类型文字(例如,[MyClass])定义类的脚本/模块文件。

    编辑:

    说了这么多。由于 .NET 和 PowerShell 中的对象激活之间存在一些不匹配,所以我想,可能只是有一种方法。我找到了它:

    Import-Module C:\ps\StackOverflow\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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多