Powershell 有没有一种方法可以在处理完纠缠模拟后将其处理掉?

Powershell 有没有一种方法可以在处理完纠缠模拟后将其处理掉?,powershell,unit-testing,mocking,pester,Powershell,Unit Testing,Mocking,Pester,我在两个不同的It“”块中为IIS方法Get IISSite设置了两个模拟 我遇到的问题是这两个it's pass,但是当我尝试执行一个不使用mock的常规测试(在相同的“上下文”中是一个新的“it”)时,该方法返回mock,即使在单独的“上下文”中也是如此。我在另一页上阅读了一些文档,这些文档建议家长可以使用mock(相同的上下文) 这让我有点担心,因为我希望找到一种机制,一旦mock不再需要在It内部进行恢复,就可以对其进行处理。是否有必要在单独的描述和/或上下文中使用相同功能的非模拟?(看

我在两个不同的It“”块中为IIS方法Get IISSite设置了两个模拟

我遇到的问题是这两个it's pass,但是当我尝试执行一个不使用mock的常规测试(在相同的“上下文”中是一个新的“it”)时,该方法返回mock,即使在单独的“上下文”中也是如此。我在另一页上阅读了一些文档,这些文档建议家长可以使用mock(相同的上下文)

这让我有点担心,因为我希望找到一种机制,一旦mock不再需要在It内部进行恢复,就可以对其进行处理。是否有必要在单独的描述和/或上下文中使用相同功能的非模拟?(看起来确实如此)

代码如下:

编写了一个方法来包装空调用以获取IISSite

### Get all IIS website collection
function IIS-SiteGetAll() {
    $sites = Get-IISSite

    if ($sites.Length -eq 0 -or $sites -eq $null) {
        throw 'No IIS Sites found, please check that IIS is installed and service is running.'
    }

    return $sites
}
测试片段

Describe 'IIS Site Methods' {
    Context 'IIS-SiteGetAll (mocked)' {

        It 'Throws error if number of sites returned is 0' {
            # Get-IISSite is the Powershell ISS command, we want it to return an empty collection
            Mock -CommandName Get-IISSite { 

                return @()                                
            }             

            { IIS-SiteGetAll } | Should Throw 

        }
        It 'Throws error if number of sites returned is $null' {
            # Get-IISSite is the Powershell ISS command, we want it to return an empty collection
            Mock -CommandName Get-IISSite { 

                return $null                               
            }             

            { IIS-SiteGetAll } | Should Throw 

        }
        It 'Returns collection of sites' { #IIS-SiteGetAll fails because it points to one of the two Mocks in the It above
            $actual = IIS-SiteGetAll

            $actual | Should -BeOfType [Microsoft.Web.Administration.Site]
            $actual.Length | Should -BeGreaterThan 0
        }
    }
    Context 'IIS-SiteGetAll' {            
        It 'Returns collection of sites' { # This separate chain exact same test passes.
            $actual = IIS-SiteGetAll

            $actual | Should BeOfType [Microsoft.Web.Administration.Site]
            $actual.Length | Should -BeGreaterThan 0
        }
    }
}
注意:powershell有点模糊,因为如果对第二个类执行GetType on actual,它将显示为对象[],BaseType为System.Array(但失败),只有[Microsoft.Web.Administration.Site]输出类似乎可以工作,它与此处的文档相匹配:


我不知道还有什么方法可以解决这个问题,但我必须在博客中找到答案,而不是在Pester的文档中找到答案。

按照OP的说法提交答案,这就是他最终所做的:


当然,我通常不会在
It
块中创建
Mock
;我会像您在这里所做的那样,为它创建一个单独的
上下文。

每个
块后都有一个
块,您可以在Pester中使用它,它将在每个
块后运行,但您需要知道如何先删除一个Mock来使用它…

假设我通常不会在
块中创建一个
Mock
;我会像您在这里所做的那样,为它创建一个单独的
上下文。每个
块后都有一个
块,你可以在Pester中使用,它将在每个
块后运行,但你需要知道如何先删除一个模拟块才能使用它…你能把它作为一个答案提交给我,这样我才能相信它,这正是我最后不得不做的