【问题标题】:Mockery: test if argument is an array containing a key/value pair嘲弄:测试参数是否是包含键/值对的数组
【发布时间】:2015-11-12 20:44:57
【问题描述】:

如何使用 mockery 和 hamcrest 断言当调用 mock 对象的方法时,传递给它的参数之一是包含键/值对的数组?

例如,我的测试代码可能如下所示:

$mock = m::mock('\Jodes\MyClass');

$mock   ->shouldReceive('myMethod')
        ->once()
        ->with(
                    arrayContainsPair('my_key', 'my_value')
                );

我知道我可以用闭包来写它,但我只是想知道是否有另一种方法让它读起来更好:

$mock   ->shouldReceive('myMethod')
        ->once()
        ->with(
                m::on(function($options){
                    return 
                        is_array($options) &&
                        isset($options['my_key']) &&
                        $options['my_key'] == 'my_val';
                })
            );

【问题讨论】:

    标签: php phpunit constraints hamcrest mockery


    【解决方案1】:

    我通过查看Hamcrest PHP code here找到了答案,

    函数名在文档注释中给出:

     * @factory hasEntry
    

    所以我的代码将如下所示:

    $mock   ->shouldReceive('myMethod')
            ->once()
            ->with(
                        hasEntry('my_key', 'my_value')
                    );
    

    【讨论】:

    • 有什么方法可以测试这个数组有两个键吗?
    • @DimitryK Hamcrest 让您结合可能有效的条件。例如allOf(hasEntry('my_key1', 'my_value1'), hasEntry('my_key2', 'my_entry2'))。此外,Mockery 有 Mockery::subset(),这也可能是您想要的。例如。 \Mockery::subset(['my_key1' => 'my_value1', 'my_key2' => 'my_entry2']).
    【解决方案2】:

    如果您对其他解决方案感兴趣,可以查看Ouzo mocking

    你可以这样做:

    //creating mock
    $mock = Mock::create('MockTestClass');
    
    //call mock
    $mock->test(['key1' => 'value1', 'key2' => 'value2']);
    
    //asserts (verification)
    Mock::verify($mock)->test(Mock::argThat()->extractField('key1')->equals('value1'));
    Mock::verify($mock)->test(Mock::argThat()->extractField('key2')->equals('value2'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-16
      • 2013-01-30
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多