Powershell scriptproperty返回类型的Pester测试

Powershell scriptproperty返回类型的Pester测试,powershell,pester,Powershell,Pester,我不熟悉pester并尝试为PowerShell类模块创建测试。我正试图确定如何测试实现类属性的特定方法 我使用的基本结构是: class TestClass { hidden [string] $_TestProp = $($this | Add-Member -MemberType ScriptProperty -Name TestProp -Value { return $this._TestProp } -SecondValue {

我不熟悉pester并尝试为PowerShell类模块创建测试。我正试图确定如何测试实现类属性的特定方法

我使用的基本结构是:

class TestClass {
    hidden [string] $_TestProp = $($this | Add-Member -MemberType ScriptProperty -Name TestProp -Value {
            return $this._TestProp
        } -SecondValue {
            param([string]$Value)
            $this._TestProp = $Value
        }
    )
}
这种结构虽然需要更多的工作,但确实允许我在类中使用我认为正常的getter\setter功能。我试图测试的是确保该属性的类型为string。我尝试查看Getter脚本块的AST,但找不到脚本块的返回类型

对于如何测试脚本块的返回类型,有人有什么想法吗

更新

根据评论中的建议,我已经改写了这门课

class TestClass {
    hidden [string] $_TestProp 

    TestClass(){
        $this | Add-Member -MemberType ScriptProperty -Name TestProp -Value {
            return $this._TestProp
        } -SecondValue {
            param([string]$Value)
            $this._TestProp = $Value
        }
    }
}

从功能上讲,它仍然是一样的,添加成员部分只是移动到构造函数区域,而不是声明。

ScriptBlocks没有一个类型签名,比如说,C do中的方法,因此真正确定返回类型的唯一方法是调用它并查看返回的内容

即使如此,返回类型也可能在调用之间发生变化。例如,下面脚本块的返回类型是什么

$myScriptBlock = {
    if( (Get-Random -Maximum 2) -gt 0 )
    {
        return 100;
    }
    else
    {
        return "aaa";
    }
}

ScriptBlock.Invoke的正式定义说它在这里返回一个集合--所以可以说这是返回类型,但这并不能真正帮助您对AST进行静态分析,以确定该集合是否包含特定脚本块的单个字符串值或其他内容。

在做了一些额外的研究之后,我能够想出以下方法来获取我要找的信息

$Instance = [TestClass]::new()
$PropName = "TestProp"
$PublicProp = $Instance.PSObject.Properties | Where-Object {$_.Name -eq "$($PropName)"}
$BackingProp = $Instance.PSObject.Properties["_$($PropName)"]
$BackingProp.TypeNameOfValue -eq $PublicProp.SetterScript.Ast.ParamBlock.Parameters.StaticType.FullName

这确保了传入的Setter值与backing属性的类型相同

您不会通过使用该模式获得任何覆盖率统计值,因为没有报告者可以解开该特定模式;太神奇了。有没有什么理由让你不只是使用方法或通过Add Type实现属性,而是编写更简洁的c?为了你的CPU之爱,请将Add Member语句移到构造函数中@马蒂亚斯,杰森,你说得对。这种模式是我在几年前尝试实现特定目标时采用的,因为访问器和变异器不是PowerShell类固有的。因为我从未经历过任何与性能相关的问题,所以我从未真正考虑过优化它。根据你的评论,我已经更新了我的模式accordingly@MaximilianBurszley我的C语言技能有点过时,这个问题只涉及一个更大项目的一小部分。目前用C重写项目中的所有类已超出范围。请参阅我建议的answerScriptblocks只是匿名函数。您可以使用Func或Action像其他任何对象一样对其进行类型转换。