繁体   English   中英

Pester 中的 Assert-MockCalled 与 Assert-VerifiableMocks

[英]Assert-MockCalled vs Assert-VerifiableMocks in Pester

是什么让 Assert-VerifiableMocks 与 Pester 中的 Assert-MockCalled 不同? 我一直在阅读

但仍然想知道:以下代码段是否等效并可互换?

使用 Assert-MockCalled:

Mock Invoke-MongoCommmand {}
Set-TargetResource -UserName $test_username -Ensure "Absent"
Assert-MockCalled Invoke-MongoCommand -ParameterFilter {
    $Expression -eq "db.dropUser('$test_username')"
}

使用 Assert-VerifiableMocks:

Mock Invoke-MongoCommand {} -Verifiable -ParameterFilter {
    $Expression -eq "db.dropUser('$test_username')"
}
Set-TargetResource -UserName $test_username -Ensure "Absent"
Assert-VerifiableMocks

的功能Assert-VerifiableMocks不是一个子集Assert-MockCalled这是一个不相交集。 使用Assert-VerifiableMocks您可以验证同时调用多个Assert-VerifiableMocks ,但如前所述,您无法验证未调用任何模拟。 我在下面有一个示例来更全面地解释这两个差异,测试示例“Get-ValueSum”。

如果您注意到Assert-verifiableMocks您可以验证测试是否在单个断言中调用了所有预期的模拟。

断言可验证示例

describe 'Assert-MockCalled vs Assert-VerifiableMocks in Pester' {
    function Get-Value1{ 1}
    function Get-Value2{ 2}
    function Get-Value3{ 3}
    
    # Should never be called by Get-ValueSum
    function Get-Value4{ 4}

    # Sums Value 1, 2 & 3, but 4 only if $include4 is specified
    function Get-ValueSum
    {
        param([switch] $inclued4 )
        if($inclued4)
        {
            return (Get-Value1) + (Get-Value2) + (Get-Value3) + (Get-Value4)
        }
        else
        {
            return (Get-Value1) + (Get-Value2) + (Get-Value3)
        }
    }

    context 'assert verifiable' {
        # Mark the first 3 mocks as verifiable 
        # because they should not be called 
        mock -CommandName Get-Value1 -MockWith { 2} -Verifiable
        mock -CommandName Get-Value2 -MockWith { 3} -Verifiable
        mock -CommandName Get-Value3 -MockWith { 4} -Verifiable
        # Add this so we can verify it is not called
        mock -CommandName Get-Value4 -MockWith { 99} 
        
        $result = Get-ValueSum

        it 'Should call the 3 expected value calls' {
            Assert-VerifiableMock
        }

        it 'should not call get-value 4' {
            Assert-MockCalled -CommandName Get-Value4 -Times 0
        }

        it 'should have gotten a sum of 9' {
            $result | should be 9
        }
        # add test for #$include4
    }
}

Assert-MockCalled 示例

describe 'Assert-MockCalled vs Assert-VerifiableMocks in Pester' {
    function Get-Value1{ 1}
    function Get-Value2{ 2}
    function Get-Value3{ 3}
    
    # Should never be called by Get-ValueSum
    function Get-Value4{ 4}

    # Sums Value 1, 2 & 3, but 4 only if $include4 is specified
    function Get-ValueSum
    {
        param([switch] $inclued4 )
        if($inclued4)
        {
            return (Get-Value1) + (Get-Value2) + (Get-Value3) + (Get-Value4)
        }
        else
        {
            return (Get-Value1) + (Get-Value2) + (Get-Value3)
        }
    }

    context 'assert mock called method' {
        # Add all mocks so we can verify 
        # if they were called or not individually
        mock -CommandName Get-Value1 -MockWith { 3} 
        mock -CommandName Get-Value2 -MockWith { 4} 
        mock -CommandName Get-Value3 -MockWith { 5} 
        mock -CommandName Get-Value4 -MockWith { 99} 

        $result = Get-ValueSum

        it 'Should call the 3 expected value calls' {
            Assert-MockCalled -CommandName Get-Value1 -Times 1
            Assert-MockCalled -CommandName Get-Value2 -Times 1
            Assert-MockCalled -CommandName Get-Value3 -Times 1
        }

        it 'should not call get-value 4' {
            Assert-MockCalled -CommandName Get-Value4 -Times 0
        }

        it 'should have gotten a sum of 12' {
            $result | should be 12
        }
        # add test for #$include4
    }
}

在您的示例中,它们是相同的,但它是关于您要检查的方式和内容。 例如,您想检查是否未调用某些内容。 你可能会使用:

Assert-MockCalled xxx -Times 0 -ParameterFilter {$x -eq "foo"}

这对于 Assert-VerifiableMocks 是不可能的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM