2015-08-19 52 views
4

如何使用mockery和hamcrest来声明当调用模拟对象的方法时,传递给它的参数之一是包含键的数组/值对?Mockery:测试参数是否包含键/值对的数组

例如,我的测试代码可能是这样的:

$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'; 
       }) 
      ); 

回答

3

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

函数名在文档注释送人:

* @factory hasEntry 

所以我的代码看起来就像这样:

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

有什么方法来测试阵列有两个键? –

+1

@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'])'。 – user2045006

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')); 
相关问题