简体   繁体   English

Pester 中的 Assert-MockCalled 与 Assert-VerifiableMocks

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

What makes Assert-VerifiableMocks different from Assert-MockCalled in Pester?是什么让 Assert-VerifiableMocks 与 Pester 中的 Assert-MockCalled 不同? I've been reading我一直在阅读

but still wonder: are the following sections of code equivalent and interchangeable?但仍然想知道:以下代码段是否等效并可互换?

Using 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')"
}

Using Assert-VerifiableMocks:使用 Assert-VerifiableMocks:

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

The functionality of Assert-VerifiableMocks isn't a subset of Assert-MockCalled it's a disjoint set.的功能Assert-VerifiableMocks不是一个子集Assert-MockCalled这是一个不相交集。 With Assert-VerifiableMocks you can verify many mocks are called at the same time, but as already mentioned you cannot verify any mocks are not called.使用Assert-VerifiableMocks您可以验证同时调用多个Assert-VerifiableMocks ,但如前所述,您无法验证未调用任何模拟。 I have an example below to more fully explain these two differences testing an example 'Get-ValueSum'.我在下面有一个示例来更全面地解释这两个差异,测试示例“Get-ValueSum”。

If you notice with Assert-verifiableMocks you can verify that the test has called all the expected mocks in a single assert.如果您注意到Assert-verifiableMocks您可以验证测试是否在单个断言中调用了所有预期的模拟。

Assert-Verifiable Sample断言可验证示例

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 Sample 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
    }
}

In your sample they are the same, however it is about how and what you want to check.在您的示例中,它们是相同的,但它是关于您要检查的方式和内容。 For example, you want to check if something is not called.例如,您想检查是否未调用某些内容。 You would probably use:你可能会使用:

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

This would be impossible with Assert-VerifiableMocks这对于 Assert-VerifiableMocks 是不可能的

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

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