diff --git a/Functions/Assertions/BeNullOrEmpty.ps1 b/Functions/Assertions/BeNullOrEmpty.ps1 index cfa56e9fd..6c47ee1d8 100644 --- a/Functions/Assertions/BeNullOrEmpty.ps1 +++ b/Functions/Assertions/BeNullOrEmpty.ps1 @@ -6,7 +6,8 @@ function PesterBeNullOrEmpty($value) { if ([String] -eq $value.GetType()) { return [String]::IsNullOrEmpty($value) } - if ($null -ne $value.Count) { + if ($null -ne $value.PSObject.Properties['Count'] -and + $null -ne $value.Count) { return $value.Count -lt 1 } return $false diff --git a/Functions/It.ps1 b/Functions/It.ps1 index 637c5b31a..232c160eb 100644 --- a/Functions/It.ps1 +++ b/Functions/It.ps1 @@ -129,6 +129,10 @@ function ItImpl Assert-DescribeInProgress -CommandName It + # Jumping through hoops to make strict mode happy. + if ($PSCmdlet.ParameterSetName -ne 'Skip') { $Skip = $false } + if ($PSCmdlet.ParameterSetName -ne 'Pending') { $Pending = $false } + #unless Skip or Pending is specified you must specify a ScriptBlock to the Test parameter if (-not ($PSBoundParameters.ContainsKey('test') -or $Skip -or $Pending)) { diff --git a/Functions/Mock.ps1 b/Functions/Mock.ps1 index 11c38c7b0..2d3ee7723 100644 --- a/Functions/Mock.ps1 +++ b/Functions/Mock.ps1 @@ -513,7 +513,7 @@ param( ) if($qualifiedCalls.Length -ne $times -and ($Exactly -or ($times -eq 0))) { - throw "Expected ${commandName}${$moduleMessage} to be called $times times exactly but was called $($qualifiedCalls.Length.ToString()) times" + throw "Expected ${commandName}${moduleMessage} to be called $times times exactly but was called $($qualifiedCalls.Length.ToString()) times" } elseif($qualifiedCalls.Length -lt $times) { throw "Expected ${commandName}${moduleMessage} to be called at least $times times but was called $($qualifiedCalls.Length) times" } @@ -842,7 +842,7 @@ function IsCommonParameter { if ([System.Management.Automation.Internal.CommonParameters].GetProperty($Name)) { return $true } if ($Metadata.SupportsShouldProcess -and [System.Management.Automation.Internal.ShouldProcessParameters].GetProperty($Name)) { return $true } - if ($Metadata.SupportsPaging -and [System.Management.Automation.PagingParameters].GetProperty($Name)) { return $true } + if ($PSVersionTable.PSVersion.Major -ge 3 -and $Metadata.SupportsPaging -and [System.Management.Automation.PagingParameters].GetProperty($Name)) { return $true } if ($Metadata.SupportsTransactions -and [System.Management.Automation.Internal.TransactionParameters].GetProperty($Name)) { return $true } } diff --git a/Functions/TestResults.Tests.ps1 b/Functions/TestResults.Tests.ps1 index 527a68eed..9edb9e948 100644 --- a/Functions/TestResults.Tests.ps1 +++ b/Functions/TestResults.Tests.ps1 @@ -69,12 +69,19 @@ InModuleScope Pester { $xmlResult = [xml] (Get-Content $testFile) $xmlTestResult = $xmlResult.'test-results'.'test-suite'.results.'test-suite' - $xmlTestResult.type | Should Be "Powershell" - $xmlTestResult.name | Should Be "Mocked Describe" - $xmlTestResult.description | Should BeNullOrEmpty - $xmlTestResult.result | Should Be "Success" - $xmlTestResult.success | Should Be "True" - $xmlTestResult.time | Should Be 2.1 + + $description = $null + if ($xmlTestResult.PSObject.Properties['description']) + { + $description = $xmlTestResult.description + } + + $xmlTestResult.type | Should Be "Powershell" + $xmlTestResult.name | Should Be "Mocked Describe" + $description | Should BeNullOrEmpty + $xmlTestResult.result | Should Be "Success" + $xmlTestResult.success | Should Be "True" + $xmlTestResult.time | Should Be 2.1 } it "should write two test-suite elements for two describes" { @@ -92,18 +99,31 @@ InModuleScope Pester { $xmlResult = [xml] (Get-Content $testFile) $xmlTestSuite1 = $xmlResult.'test-results'.'test-suite'.results.'test-suite'[0] - $xmlTestSuite1.name | Should Be "Describe #1" - $xmlTestSuite1.description | Should BeNullOrEmpty - $xmlTestSuite1.result | Should Be "Success" - $xmlTestSuite1.success | Should Be "True" - $xmlTestSuite1.time | Should Be 1.0 + + $description = $null + if ($xmlTestSuite1.PSObject.Properties['description']) + { + $description = $xmlTestSuite1.description + } + + $xmlTestSuite1.name | Should Be "Describe #1" + $description | Should BeNullOrEmpty + $xmlTestSuite1.result | Should Be "Success" + $xmlTestSuite1.success | Should Be "True" + $xmlTestSuite1.time | Should Be 1.0 $xmlTestSuite2 = $xmlResult.'test-results'.'test-suite'.results.'test-suite'[1] - $xmlTestSuite2.name | Should Be "Describe #2" - $xmlTestSuite2.description | Should BeNullOrEmpty - $xmlTestSuite2.result | Should Be "Failure" - $xmlTestSuite2.success | Should Be "False" - $xmlTestSuite2.time | Should Be 2.0 + $description = $null + if ($xmlTestSuite2.PSObject.Properties['description']) + { + $description = $xmlTestSuite2.description + } + + $xmlTestSuite2.name | Should Be "Describe #2" + $description | Should BeNullOrEmpty + $xmlTestSuite2.result | Should Be "Failure" + $xmlTestSuite2.success | Should Be "False" + $xmlTestSuite2.time | Should Be 2.0 } it "should write parent results in tree correctly" { @@ -244,12 +264,18 @@ InModuleScope Pester { It 'should write parameterized test results correctly' { $xmlTestSuite = $xmlResult.'test-results'.'test-suite'.'results'.'test-suite'.'results'.'test-suite' - $xmlTestSuite.name | Should Be 'Parameterized Testcase ' - $xmlTestSuite.description | Should BeNullOrEmpty - $xmlTestSuite.type | Should Be 'ParameterizedTest' - $xmlTestSuite.result | Should Be 'Failure' - $xmlTestSuite.success | Should Be 'False' - $xmlTestSuite.time | Should Be '2' + $description = $null + if ($xmlTestSuite.PSObject.Properties['description']) + { + $description = $xmlTestSuite.description + } + + $xmlTestSuite.name | Should Be 'Parameterized Testcase ' + $description | Should BeNullOrEmpty + $xmlTestSuite.type | Should Be 'ParameterizedTest' + $xmlTestSuite.result | Should Be 'Failure' + $xmlTestSuite.success | Should Be 'False' + $xmlTestSuite.time | Should Be '2' foreach ($testCase in $xmlTestSuite.results.'test-case') { diff --git a/Functions/TestResults.ps1 b/Functions/TestResults.ps1 index 07b654b06..7ce6d50a0 100644 --- a/Functions/TestResults.ps1 +++ b/Functions/TestResults.ps1 @@ -149,7 +149,12 @@ function Write-NUnitCultureInformation($PesterState, [System.Xml.XmlWriter] $Xml function Write-NUnitGlobalTestSuiteAttributes($PesterState, [System.Xml.XmlWriter] $XmlWriter, [switch] $LegacyFormat) { $XmlWriter.WriteAttributeString('type', 'Powershell') - $XmlWriter.WriteAttributeString('name', $PesterState.Path) + + # TODO: This used to be writing $PesterState.Path, back when that was a single string (and existed.) + # Better would be to produce a test suite for each resolved file, rather than for the value + # of the path that was passed to Invoke-Pester. + + $XmlWriter.WriteAttributeString('name', 'Pester') $XmlWriter.WriteAttributeString('executed', 'True') $isSuccess = $PesterState.FailedCount -eq 0 @@ -163,23 +168,26 @@ function Write-NUnitGlobalTestSuiteAttributes($PesterState, [System.Xml.XmlWrite function Write-NUnitDescribeElements($PesterState, [System.Xml.XmlWriter] $XmlWriter, [switch] $LegacyFormat) { $Describes = $PesterState.TestResult | Group-Object -Property Describe - foreach ($currentDescribe in $Describes) + if ($null -ne $Describes) { - $DescribeInfo = Get-TestSuiteInfo $currentDescribe + foreach ($currentDescribe in $Describes) + { + $DescribeInfo = Get-TestSuiteInfo $currentDescribe - #Write test suites - $XmlWriter.WriteStartElement('test-suite') + #Write test suites + $XmlWriter.WriteStartElement('test-suite') - if ($LegacyFormat) { $suiteType = 'PowerShell' } else { $suiteType = 'TestFixture' } + if ($LegacyFormat) { $suiteType = 'PowerShell' } else { $suiteType = 'TestFixture' } - Write-NUnitTestSuiteAttributes -TestSuiteInfo $DescribeInfo -TestSuiteType $suiteType -XmlWriter $XmlWriter -LegacyFormat:$LegacyFormat + Write-NUnitTestSuiteAttributes -TestSuiteInfo $DescribeInfo -TestSuiteType $suiteType -XmlWriter $XmlWriter -LegacyFormat:$LegacyFormat - $XmlWriter.WriteStartElement('results') + $XmlWriter.WriteStartElement('results') - Write-NUnitDescribeChildElements -TestResults $currentDescribe.Group -XmlWriter $XmlWriter -LegacyFormat:$LegacyFormat -DescribeName $DescribeInfo.Name + Write-NUnitDescribeChildElements -TestResults $currentDescribe.Group -XmlWriter $XmlWriter -LegacyFormat:$LegacyFormat -DescribeName $DescribeInfo.Name - $XmlWriter.WriteEndElement() - $XmlWriter.WriteEndElement() + $XmlWriter.WriteEndElement() + $XmlWriter.WriteEndElement() + } } } diff --git a/Pester.psm1 b/Pester.psm1 index 4a1e9f763..65e170438 100644 --- a/Pester.psm1 +++ b/Pester.psm1 @@ -220,7 +220,7 @@ about_pester Show-CoverageReport -CoverageReport $coverageReport Exit-CoverageAnalysis -PesterState $pester - if($OutputFile) { + if(Get-Variable -Name OutputFile -ValueOnly -ErrorAction $script:IgnoreErrorPreference) { Export-PesterResults -PesterState $pester -Path $OutputFile -Format $OutputFormat } @@ -368,7 +368,7 @@ function Get-ScriptBlockScope } $snippetsDirectoryPath = "$PSScriptRoot\Snippets" -if (($null -ne $psISE) -and ($PSVersionTable.PSVersion.Major -ge 3) -and (Test-Path $snippetsDirectoryPath)) +if ((Test-Path -Path Variable:\psise) -and ($null -ne $psISE) -and ($PSVersionTable.PSVersion.Major -ge 3) -and (Test-Path $snippetsDirectoryPath)) { Import-IseSnippet -Path $snippetsDirectoryPath }