Today, I continue with another post on Pester. I want to check that each of my parameters declared in my PARAM() block is separated by a empty line.

This will help bring clarity to my code and make it easier to read for other people.

Example

Here is an example,I don’t want this:

Instead,I want all the comment based help in that format (with an empty line between each parameters)

Code

This can be accomplish by something like that:

[ CmdletBinding ()] PARAM ( $ModuleName = "ADSIPS" , $GithubRepository = "github.com/lazywinadmin/" ) # Make sure one or multiple versions of the module are note loaded Get-Module -Name $ModuleName | remove-module # Find the Manifest file $ManifestFile = " $( Split-path ( Split-Path -Parent -Path $MyInvocation . MyCommand . Definition )) \ $ModuleName \ $ModuleName . psd1 " # Import the module and store the information about the module $ModuleInformation = Import-module -Name $ManifestFile -PassThru # Get the functions present in the Manifest $ExportedFunctions = $ModuleInformation .ExportedFunctions.Values.name # Testing the Module Describe " $ModuleName Module - HELP " -Tags " Module " { FOREACH ( $funct in $ExportedFunctions ) { $FunctionContent = Get-Content function: $funct $AST = [System.Management.Automation.Language.Parser]::ParseInput( $FunctionContent , [ref] $null , [ref] $null ) Context " $funct - Help "{ # Parameters separated by a space $ParamText = $AST .ParamBlock.extent.text -split '\r

' # split on carriage return $ParamText = $ParamText .trim() # Trim the edges $ParamTextSeparator = $ParamText | select-string ', $ ' #line that finish by a ',' if ( $ParamTextSeparator ) { Foreach ( $ParamLine in $ParamTextSeparator .linenumber) { it " Parameter - Separated by space ( Line $ParamLine ) "{ $ParamText [ $ParamLine ] -match '^ $ |\s+' | Should Be $true } } } } #Context } #FOREACH } #Describe

Step by Step

So what is happening here ?

#1 - Using Abstract Syntax Tree (AST), we retrieve the content of the PARAM() block and split on the carriage return character

$ParamText = $AST . ParamBlock . extent . text -split '\r

'

#2 - We trim the edges of each lines

$ParamText = $ParamText . trim ()

#3 - We find the line that finish by a comma character , .

Here we are using Regex and the Dollar sign $ that will matches the ending of a line.

$ParamTextSeparator = $ParamText | select-string ',$'

#4 - Then for each lines that finish by a comma character, we will check if the next line is empty or contains only white spaces, which is fine too. Again we will be using regex here, ^$ matches an empty line and \s+ matches one ore more whitespaces. This should return either $true or $false and we can use Pester from here to return the success of failure of the test.

$ParamText [ $ParamLine ] -match '^$|\s+' | Should Be $true

Related posts