diff --git a/src/functions/InModuleScope.ps1 b/src/functions/InModuleScope.ps1 index 9b9066b43..78f159fb1 100644 --- a/src/functions/InModuleScope.ps1 +++ b/src/functions/InModuleScope.ps1 @@ -176,7 +176,12 @@ function Get-CompatibleModule { if ($PesterPreference.Debug.WriteDebugMessages.Value) { Write-PesterDebugMessage -Scope Runtime "Searching for a module $ModuleName." } - $modules = @(& $SafeCommands['Get-Module'] -Name $ModuleName -All -ErrorAction Stop) + if ($ModuleName -match '(?\w+)/(?\w+)') { + $modules = @(& $SafeCommands['Get-Module'] -Name $Matches['RootModule'] -All -ErrorAction Stop | & $SafeCommands['Select-Object'] -ExpandProperty NestedModules | & $SafeCommands['Where-Object'] { $_.Name -eq $Matches['NestedModule'] }) + } + else { + $modules = @(& $SafeCommands['Get-Module'] -Name $ModuleName -All -ErrorAction Stop) + } } catch { throw "No modules named '$ModuleName' are currently loaded." diff --git a/tst/functions/InModuleScope.Tests.ps1 b/tst/functions/InModuleScope.Tests.ps1 index 9f3f74fd1..4ac84d7ec 100644 --- a/tst/functions/InModuleScope.Tests.ps1 +++ b/tst/functions/InModuleScope.Tests.ps1 @@ -125,6 +125,29 @@ Describe 'Get-CompatibleModule' { } } + Context 'when module name matches a root and a nested module' { + BeforeAll { + $nestedModuleName = 'NestedModule' + $moduleName = 'RootWithNestedModule' + $moduleManifestPath = "TestDrive:/$moduleName.psd1" + New-Item -Path "TestDrive:/$nestedModuleName.psm1" -ItemType File -Force -ErrorAction Stop | Out-Null + New-ModuleManifest -Path $moduleManifestPath -NestedModules ".\$nestedModuleName.psm1" + Import-Module $moduleManifestPath -Force + } + + AfterAll { + Get-Module $moduleName -ErrorAction SilentlyContinue | Remove-Module -Force + } + + It 'should return a single ModuleInfo object' { + $moduleInfo = InPesterModuleScope { Get-CompatibleModule -ModuleName 'RootWithNestedModule/NestedModule' } + $moduleInfo | Should -Not -BeNullOrEmpty + @($moduleInfo).Count | Should -Be 1 + $moduleInfo.Name | Should -Be 'NestedModule' + $moduleInfo.ModuleType | Should -Be 'Script' + } + } + } Describe 'InModuleScope arguments and parameter binding' { @@ -340,4 +363,4 @@ Describe 'Working with manifest modules' { $res = InModuleScope -ModuleName $moduleName -ScriptBlock { myPrivateFunction } $res | Should -Be 'real' } -} \ No newline at end of file +}