コンソールロガーがあります
function Common-Write-Log-Console
{
param (
[Parameter(Mandatory=$true)]
[string] $logText
)
$textToOutput = [String]::Format("{0}:{1}", [System.DateTime]::Now.ToString(), $logText)
Write-Output ($textToOutput)
}
次に、動的にロードして呼び出すラッパー関数があります
function Common-Write-Log-WithInvoke
{
param (
[Parameter(Mandatory=$true)]
[string] $logText
)
foreach($logger in $loggers.Values)
{
Invoke-Command $logger -ArgumentList $logText,$verbosityLevel,$logType
}
}
それを直接呼び出す別のラッパー関数
function Common-Write-Log-WithoutInvoke
{
param (
[Parameter(Mandatory=$true)]
[string] $logText,
[string] $verbosityLevel = "Normal",
[string] $logType = "Info"
)
Common-Write-Log-Console $logText
}
動的呼び出し用のロガーを追加する
$loggers = @{}
$loggers.Add("Console_Logger", ${function:Common-Write-Log-Console})
今、私はいくつかのペスターテストを持っています
# pester tests
Describe "Common-Write-Log" {
It "Test 1. Calls all log sources when log sources are called directly - **this test passes**" {
# Arrange
$expectedLogText = "test message"
Mock Common-Write-Log-Console -Verifiable -ParameterFilter { $logText -eq $expectedLogText}
# Act
Common-Write-Log-WithoutInvoke "test message"
# Assert
Assert-VerifiableMocks
}
It "Test 2. Calls all log sources when log sources are called through Invoke-Command - **this test fails**" {
# Arrange
$expectedLogText = "test message"
Mock Common-Write-Log-Console -Verifiable -ParameterFilter { $logText -eq $expectedLogText}
# Act
Common-Write-Log-WithInvoke "test message"
# Assert
Assert-VerifiableMocks # This statement fails as actual function "Common-Write-Log-Console" is called instead of the mocked one
}
}
テスト 2. は常に失敗します。モックを使用していくつかのグローバル変数を設定し、意図した関数の動的な読み込みと呼び出しが機能することをテストで検証/アサートする代わりに、偽のロガー関数を作成することで回避しました。それらのばかげた偽物を書くのではなく、そのようなシナリオでモックを機能させるのは素晴らしいことです!
それがどのように機能するか、またはペスターによってまったくサポートされていないというアイデアはありますか?
PS: 順番にコピーすれば、すべてのコードが機能します