Je travaille sur des cas de test Pester et je regarde les résultats de CodeCoverage. Dans la plupart des cas de test où le code contient un try/catch, nous obtenons une couverture de 0% sur la capture. Voici un exemple:Can Pester peut-il se moquer d'une exception?
function Test-Is64Bit()
{
$Result = $false
try
{
if ((Get-WmiObject -Class "Win32_OperatingSystem").OSArchitecture -eq '64-bit')
{
$Result = $true
}
}
catch
{
Write-Error $_.Exception | Format-List -Force
}
return $Result
}
Il est assez facile de se moquer de la valeur de retour Get-WmiObject pour tester la vraie condition $.
J'ai déjà essayé un certain nombre d'idées pour simuler une exception de Get-WmiObject mais dans tous les cas, l'exception est transmise à la console au lieu d'être interceptée par Pester et de passer le test. Voici le meilleur que j'ai trouvé, mais ça ne marche toujours pas.
Context "Unit tests for Get-WmiObject exception" {
# mock the Get-WmiObject cmdlet for unit testing
Mock Get-WmiObject {
Throw
} -ParameterFilter { $Class -And $Class -eq 'Win32_OperatingSystem' }
It "Function test passes" {
{ Test-Is64Bit } | Should Be $false
Assert-MockCalled Get-WmiObject -Scope It -Exactly -Times 1
}
}
Ce résultats des tests dans:
Context Unit tests for Get-WmiObject error
[-] Function test passes 138ms
Expected: {False}
But was: { Test-Is64Bit }
at line: 62 in .\Tests\Test-Is64Bit.Tests.ps1
62: { Test-Is64Bit } | Should Be $false
Tests completed in 590ms
Tests Passed: 4 Failed: 1 Skipped: 0 Pending: 0 Inconclusive: 0
Code coverage report:
Covered 80.00 % of 10 analyzed Commands in 1 File.
Missed commands:
File Function Line Command
---- -------- ---- -------
Test-Is64Bit.ps1 Test-Is64Bit 38 Write-Error $_.Exception
Test-Is64Bit.ps1 Test-Is64Bit 38 Format-List -Force
Est ce que le tout moyen de se moquer d'une exception levée par Get-WmiObject afin que nous puissions avoir Pester tomber dans les prises et enfin atteindre 100% de couverture de code?
Mon code de test en cours à la recherche des exceptions
Context "Unit tests for Get-WmiObject exception" {
# mock the Get-WmiObject cmdlet for unit testing
Mock Get-WmiObject {
Throw 'Some Error'
} -ParameterFilter { $Class -And $Class -eq 'Win32_OperatingSystem' }
It 'Get-WmiObject should throw' {
{ Get-WmiObject -Class 'Win32_OperatingSystem' } | Should Throw 'Some Error'
}
It "Throws exception" {
{ Test-Is64Bit } | Should Throw 'Some Error'
Assert-MockCalled Get-WmiObject -Scope It -Exactly -Times 1
}
}
Les résultats de code ci-dessus dans ce:
Context Unit tests for Get-WmiObject exception
[+] Get-WmiObject should throw 89ms
Test-Is64Bit : System.Management.Automation.RuntimeException: Some Error At
C:\ONESolutionFinance\Main\ReleaseManagement\PowerShell-Module\SPSNoDeps\Tests\Test-Is64Bit.Tests.ps1:66
char:7
+ { Test-Is64Bit } | Should Throw 'Some Error'
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Test-Is64Bit
[-] Throws exception 51ms
Expected: the expression to throw an exception with message {Some Error}, an exception was not raised, message was {}
from line:2 char:5
+ Throw 'Some Error'
+ ~~~~~~~~~~~~~~~~~~
at line: 66 in C:\ONESolutionFinance\Main\ReleaseManagement\PowerShell-Module\SPSNoDeps\Tests\Test-Is64Bit.Tests.ps1
66: { Test-Is64Bit } | Should Throw 'Some Error'
Test de $ fausses déclarations ceci:
Context Unit tests for Get-WmiObject exception
[+] Get-WmiObject should throw 162ms
Test-Is64Bit : System.Management.Automation.RuntimeException: Some Error
At C:\ONESolutionFinance\Main\ReleaseManagement\PowerShell-Module\SPSNoDeps\Tests\Test-Is64Bit.Tests.ps1:66 char:5
+ Test-Is64Bit | Should Be $false
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Test-Is64Bit
[+] Throws exception 92ms
J'ai mis à jour mon message original pour rendre la question un peu plus claire. Se moquer d'une exception Get-WmiObject et tester l'exception dans Pester fonctionne très bien. Mais existe-t-il un moyen de tester la fonction Test-Is64Bit et Get-WmiObject lance une exception de sorte que le test Pester tombe dans la capture à l'intérieur de Test-Is64Bit. Je reçois toujours des tests échoués et voir des exceptions lancées sur la console. –
Utilisez -erroraction stop sur get-wmiobject dans votre fonction? Si ce n'est pas le cas, votre capture ne sera jamais invoquée? –
J'ai essayé avec et sans arrêt -ErrorAction sur Get-WmiObject. La même exception est affichée dans la console. –