PowerShell/Pester - Make sure your parameters are separated by an empty line

2016/08/24 | 2 minute read |

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"{
            
            <span style="background-color: yellow; color: green;"># Parameters separated by a space
            <span style="background-color: yellow;">$ParamText = $AST.ParamBlock.extent.text -split '\r\n' # split on carriage return
            <span style="background-color: yellow;">$ParamText = $ParamText.trim() # Trim the edges
            <span style="background-color: yellow;">$ParamTextSeparator = $ParamText | select-string ',$' #line that finish by a ','
            
            if ($ParamTextSeparator)
            {
                Foreach ($ParamLine in $ParamTextSeparator.linenumber)
                {
                    it "Parameter - Separated by space (Line $ParamLine)"{
                        <span style="background-color: yellow;">$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 thePARAM() block and split on the carriage return character

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

#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

Leave a Comment