In C#, writing unit tests is king, and Moq is the hotness we use to Mock objects and methods, like the MockObjects we get with Pester in PowerShell.
But one rough part of it is the syntax for Moq, which requires you to write a handler and specify each input argument, which can get pretty verbose and tiresome.
To ease this up, try this function, which will take a method signature and convert it into a sample Mock.Setup or Mock.Verify block, ready for testing
<# | |
.Synopsis | |
Creates your Moq.Setups for you! | |
.DESCRIPTION | |
Provide a method signature to receive an example of a basic, lazy Mock for the method | |
.EXAMPLE | |
$myMethodSignature = " | |
GetDeploymentStatus( | |
string someToken, | |
int someIntValue = 10, | |
bool someBoolValue = false, | |
TimeSpan delayLookup = default, | |
CancellationToken cancellationToken | |
)" | |
New-MoqMethodConfiguration $myMethodSignature | |
.Setup(m=>m. | |
GetDeploymentStatus(It.IsAny<string>(),It.IsAny<int>(),It.IsAny<bool>(),It.IsAny<TimeSpan>(),It.IsAny<CancellationToken>())).Returns… | |
.EXAMPLE | |
Another example of how to use this cmdlet | |
#> | |
Function New-MoqMethodConfiguration{ | |
[CmdletBinding()] | |
param( | |
[String] | |
$methodSignature, | |
[Switch] | |
$Verify = $false | |
) | |
$outputs = New-Object System.Collections.ArrayList | |
$methodName = $methodSignature.Split('(')[0] | |
Write-Verbose "found method of name $methodName" | |
$parms= $methodSignature.Split('(')[1..10].Split("`n").Trim().Replace(')','') | |
Write-Verbose "found $($parms.Count) parameters" | |
ForEach($parm in $parms){ | |
if($parm.Length -le 0){continue} | |
Write-Verbose "processing $parm " | |
$outputs.Add("It.IsAny<$($parm.Split()[0])>()") | Out-Null | |
} | |
$paramMatcher = $outputs -join "," | |
if ($Verify){ | |
Write-output ".Verify(m=>m.$($methodName)($paramMatcher), Times.Once)" | |
} | |
else{ | |
Write-output ".Setup(m=>m.$($methodName)($paramMatcher)).Returns…" | |
} | |
} |