Reputation: 351
Trying to learn Pester (v5.0.4 and PS v7.0.3). I have these files
Get-Planet2.ps1:
function Get-Planet ([string]$Name = '*') {
$planets = @(
@{ Name = 'Mercury' }
@{ Name = 'Venus' }
@{ Name = 'Earth' }
@{ Name = 'Mars' }
@{ Name = 'Jupiter' }
@{ Name = 'Saturn' }
@{ Name = 'Uranus' }
@{ Name = 'Neptune' }
) | ForEach-Object { [PSCustomObject] $_ }
$planets | Where-Object { $_.Name -like $Name }
}
Get-Planet2.Tests.ps1:
BeforeAll {
# This will bring the function from the main file back to scope.
. $PSScriptRoot/Get-Planet2.ps1
param(
[parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$name,
[parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$title,
[parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$InputFile
)
}
Describe 'Get-Planet' {
It 'Given no parameters, it lists all 8 planets' {
$allPlanets = Get-Planet
$allPlanets.Count | Should -Be 8
}
It 'Earth is the third planet in our Solar System' {
$allPlanets = Get-Planet
$allPlanets[2].Name | Should -Be 'Earth'
}
It 'Pluto is not part of our Solar System' {
$allPlanets = Get-Planet
$plutos = $allPlanets | Where-Object Name -EQ 'Pluto'
$plutos.Count | Should -Be 0
}
It 'Planets have this order: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune' {
$allPlanets = Get-Planet
$planetsInOrder = $allPlanets.Name -join ', '
$planetsInOrder | Should -Be 'Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune'
}
}
Call-Get-Planet2.ps1:
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$path = "$here/Get-Planet2.Tests.ps1"
$parameters = @{name = "John"; title = "Sales"; InputFile = "$here/test.json"}
write-host "Path: $path"
write-host $parameters
Invoke-Pester -Script @{Path=$path;Parameters=$parameters}
When I run Call-Get-Planet2.ps1, I ended with the below error. I can't figure out why it is doing this. Need guidance. Thanks
System.Management.Automation.RuntimeException: No test files were found and no scriptblocks were provided. at Invoke-Pester, /Users/myaccount/.local/share/powershell/Modules/Pester/5.0.4/Pester.psm1: line 4520 at , /Users/myaccount/repos/myrepo/Pester/Call-Get-Planet2.ps1: line 8 at , : line 1
Upvotes: 4
Views: 2305
Reputation: 54911
Pester v5 had a breaking change and removed support for Invoke-Pester -Script <hashtable>
. Pester 5.1 re-introduced support for script parameters using containers which you create with New-PesterContainer -Path <file> -Data <parametersHashtable>
and invoke using Invoke-Pester -Container ...
.
For the original demo, upgrade to Pester 5.1 or later and modify:
# Script parameters need to be in the root of the file.
param(
[parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$name,
[parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$title,
[parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$InputFile
)
BeforeAll {
# This will bring the function from the main file back to scope.
. $PSScriptRoot/Get-Planet2.ps1
}
Describe 'Get-Planet' {
It 'Given no parameters, it lists all 8 planets' {
$allPlanets = Get-Planet
$allPlanets.Count | Should -Be 8
}
It 'Earth is the third planet in our Solar System' {
$allPlanets = Get-Planet
$allPlanets[2].Name | Should -Be 'Earth'
}
It 'Pluto is not part of our Solar System' {
$allPlanets = Get-Planet
$plutos = $allPlanets | Where-Object Name -EQ 'Pluto'
$plutos.Count | Should -Be 0
}
It 'Planets have this order: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune' {
$allPlanets = Get-Planet
$planetsInOrder = $allPlanets.Name -join ', '
$planetsInOrder | Should -Be 'Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune'
}
}
# $PSScriptRoot is easier than Split-Path :-)
$here = $PSScriptRoot
$path = "$here/Get-Planet2.Tests.ps1"
$parameters = @{name = 'John'; title = 'Sales'; InputFile = "$here/test.json" }
Write-Host "Path: $path"
Write-Host $parameters
# -Script <hashtable> is not supported in v5.
# Use New-PesterContainer
$container = New-PesterContainer -Path $path -Data $parameters
Invoke-Pester -Container $container
Upvotes: 0
Reputation: 9601
If you encounter this error ('No test files were found and no scriptblocks were provided'), you should follow LievenKeersmaekers'
suggestion (made in the question comments), which is to execute the test file more directly by doing something like the following:
cd {TO\A\FOLDER\WITH\A\TEST_FILE}
Invoke-Pester -Path .\{TEST_FILE}.ps1
You'll likely see a more descriptive error message that will help you to solve your issue.
Upvotes: 1