Тест Pester для типа возвращаемого скрипта - PullRequest
1 голос
/ 01 апреля 2020

Я новичок в pester и пытаюсь создать тесты для модулей класса PowerShell. Я пытаюсь определить, как тестировать мой конкретный метод реализации свойств для моих классов.

Базовая структура c, которую я использую:

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. Я попытался просмотреть AST для блока сценариев Getter, но мне не удалось найти тип возвращаемого значения блока сценария.

У кого-нибудь есть идеи относительно того, как я буду проверять возвращение тип блока сценария?

Обновление

Согласно предложению в комментариях, я переписал класс как таковой

class TestClass {
    hidden [string] $_TestProp 

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

Функционально это то же самое, раздел add member был просто перемещен в область конструктора вместо объявления.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

После некоторых дополнительных исследований я смог найти следующий метод получения информации, которую я искал

$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 того же типа, что и резервное имущество

0 голосов
/ 02 апреля 2020

ScriptBlocks не имеют сигнатуры типа, как, скажем, методы в C#, поэтому единственный способ определить тип возвращаемого значения - вызвать его и посмотреть, что вы получите.

Даже тогда тип возврата может меняться между вызовами. Например, каков тип возвращаемого блока скрипта ниже?

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

Формальное определение ScriptBlock.Invoke гласит, что здесь возвращается Collection<PSObject> - https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.invoke?view=pscore-6.2.0 - так вы могли бы сказать, что это тип возвращаемого значения, но это на самом деле не поможет вам выполнить c анализ AST, чтобы определить, содержит ли эта коллекция одно строковое значение или что-то еще для указанного c блок сценария ...

...