Mock in PHPUnit - multiple configuration of the same method with different arguments

前端 未结 7 744
死守一世寂寞
死守一世寂寞 2020-11-29 22:26

Is it possible to configure PHPUnit mock in this way?

$context = $this->getMockBuilder(\'Context\')
   ->getMock();

$context->expects($this->any         


        
7条回答
  •  心在旅途
    2020-11-29 22:38

    You can achieve this with a callback:

    class MockTest extends PHPUnit_Framework_TestCase
    {
        /**
         * @dataProvider provideExpectedInstance
         */
        public function testMockReturnsInstance($expectedInstance)
        {
            $context = $this->getMock('Context');
    
            $context->expects($this->any())
               ->method('offsetGet')
               // Accept any of "Matcher" or "Logger" for first argument
               ->with($this->logicalOr(
                    $this->equalTo('Matcher'),
                    $this->equalTo('Logger')
               ))
               // Return what was passed to offsetGet as a new instance
               ->will($this->returnCallback(
                   function($arg1) {
                       return new $arg1;
                   }
               ));
    
           $this->assertInstanceOf(
               $expectedInstance,
               $context->offsetGet($expectedInstance)
           );
        }
        public function provideExpectedInstance()
        {
            return array_chunk(array('Matcher', 'Logger'), 1);
        }
    }
    

    Should pass for any "Logger" or "Matcher" arguments passed to the Context Mock's offsetGet method:

    F:\Work\code\gordon\sandbox>phpunit NewFileTest.php
    PHPUnit 3.5.13 by Sebastian Bergmann.
    
    ..
    
    Time: 0 seconds, Memory: 3.25Mb
    
    OK (2 tests, 4 assertions)
    

    As you can see, PHPUnit ran two tests. One for each dataProvider value. And in each of those tests it made the assertion for with() and the one for instanceOf, hence four assertions.

提交回复
热议问题