2017-07-01 5 views
1

J'apprends lentement en utilisant le test d'unité Pester pour Powershell depuis un moment. Je suis un peu bloqué sur l'utilisation de vérifier si ma fonction peut fonctionner "si aucune entrée obligatoire dans une fonction n'est fournie". ce qui me donne un feu rouge ici et voulait obtenir un résultat de test vert et passer au codage.Fonction de test d'unité de testeur avec Mandatory = True

J'ai donc une fonction comme suit.

function Code() 
{  
param(
    [parameter(Mandatory=$true)] 
    [string]$SourceLocation) 
return "Hello from $SourceLocation" 
} 

mon script de test est exécuté avec les contrôles suivants ...

$moduleName = 'Code'; 
Describe $moduleName {   
     Context "$Function - Returns a result " { 
      It "does something useful with just $Function function name" { 
      $true | Should Be $true 
      } 
     } 

     Context "$Function - Returns with no input " { 
     It "with no input returns Mandatory value expected" { 
      Code | Should Throw 
     } 
     } 

     Context "$Function - Returns some output" { 
      It "with a name returns the standard phrase with that name" { 
       Code "Venus" | Should Be "Hello from Venus" 
      } 
      It "with a name returns something that ends with name" { 
       Code "Mars" | Should Match ".*Mars" 
      } 
     } 

    } #End Describe 

ma sortie de AppVeyor montre ce résultat que le [+] sont des couleurs vertes et [-] est une couleur rouge c'est ce que j'évite du mieux que je peux.

Describing Code 
    Context Code - Returns a result 
     [+] does something useful with just Code function name 16ms 
    Context Code - Returns with no input 
     [-] with no input returns Mandatory value expected 49ms 
     Cannot process command because of one or more missing mandatory parameters: SourceLocation. 
     at <ScriptBlock>, C:\projects\code\Code.Tests.ps1: line 117 
     117:   Code | Should Throw 

    Context Code - Returns some output 
     [+] with a name returns the standard phrase with that name 23ms 
     [+] with a name returns something that ends with name 11ms 

Toute aide est appréciée comme je voudrais une condition verte là-bas que je ne suis pas sûr de savoir comment surmonter certains types de réponses de message de Powershell et traduire en tests unitaires ...

+2

['Should' les tests pour Throw et Not Throw nécessitent un scriptblock en entrée] (https://github.com/pester/Pester/wiki/Should#throw), essayez donc {{Code} | Should Throw' – TessellatingHeckler

+0

Oh, qu'est-ce que tu sais ... ça marche! Merci pour ce @TessellatingHeckler –

Répondre

2

par la commentaire de TessellatingHeckler, votre code ne fonctionne pas parce que, pour tester Throw vous devez redirigez la Should cmdlet un scriptblock { }:

{Code} | Should Throw 

Il convient de noter cependant que (lorsque Testin g pour un paramètre obligatoire) fonctionne correctement dans AppVeyor car PowerShell s'exécute dans une console non interactive (PowerShell.exe -noninteractive). Si vous essayez d'exécuter vos tests Pester localement, vos tests seront apparemment interrompus à mesure que vous serez invité à les saisir.

Il y a deux façons de contourner cela, on est seulement de lancer vos tests localement en utilisant PowerShell en mode non interactif:

PowerShell.exe -noninteractive {Invoke-Pester} 

Une autre est de passer le paramètre une valeur explicite $null ou vide (avec la mise en garde vous pouvez réellement avoir un paramètre de chaîne obligatoire qui accepte $null et cette solution ne fonctionnera pas nécessairement avec tous les autres types de paramètres):

It "with no input returns Mandatory value expected" { 
    {Code $null} | Should Throw 
} 

Cependant, il est intéressant de noter que ces deux solutions lancer différents messages d'exception, et vous devriez tester un message explicite pour le Throw afin que votre test ne passe pas si le code échoue pour une autre raison. Par exemple:

Courir avec -noninteractive

It "with no input returns Mandatory value expected" { 
    {Code} | Should Throw 'Cannot process command because of one or more missing mandatory parameters: SourceLocation.' 
} 

$ null En passant, il

It "with no input returns Mandatory value expected" { 
    {Code $null} | Should Throw "Cannot bind argument to parameter 'SourceLocation' because it is an empty string." 
} 

En résumé, ce n'est une question complexe pour ce scénario spécifique parce que votre paramètre est obligatoire et vous testez pour son absence.

Test des exceptions est généralement un processus simple:

{ some code } | should Throw 'message' 

Et fonctionne très bien à la fois une console interactive et non interactive.