2 minute read

pester logo

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:

PowerShellPester EmptyLine between parameter01

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

PowerShellPester EmptyLine between parameter02

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\n' # 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\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

PowerShellPester EmptyLine between parameter03

Leave a comment