2014-03-24 37 views
2

我测试使用PHPUnit的方法,我有以下情形:测试调用该方法有一些参数,等等

  • 法“的setParameter”被称为次
  • 方法的未知量'setParameter'被调用不同类型的参数
  • 各种参数之间的方法'setParameter'务必用一组参数调用。

我试着做这种方式:

$mandatoryParameters = array('param1', 'param2', 'param3'); 
foreach ($mandatoryParameters as $parameter) { 
    $class->expects($this->once()) 
     ->method('setParameter') 
     ->with($parameter); 
} 

不幸的是,测试方法之前被调用,这些参数它被称为与其它参数也因失败。我得到的错误是:

Parameter 0 for invocation Namespace\Class::setParameter('random_param', 'random_value') 
does not match expected value. 
Failed asserting that two strings are equal. 

回答

1

尝试使用$this->at()方法。每次用循环覆盖你的模拟。

$mandatoryParameters = array('param1', 'param2', 'param3'); 
$a = 0; 
foreach ($mandatoryParameters as $parameter) { 
    $class->expects($this->at($a++); 
     ->method('setParameter') 
     ->with($parameter); 
} 

这将设置你的模拟期望setParameter被称为一定的次数和每次调用将与不同的参数。您需要知道哪个呼叫是您的参数的具体内容,并相应地调整该号码。如果调用不是顺序的,可以为每个参数的索引设置一个键。

$mandatoryParameters = array(2 =>'param1', 5 => 'param2', 6 => 'param3'); 

foreach ($mandatoryParameters as $index => $parameter) { 
    $class->expects($this->at($index); 
     ->method('setParameter') 
     ->with($parameter); 
} 

该指数是基于零所以,要记得从0开始计数的,而不是1

http://phpunit.de/manual/current/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers

+0

如果我不知道该功能会究竟有多少次被称为有我无法检查它是否会在其他调用中与这些参数一起调用? – spdionis

+1

你不需要知道函数会被调用多少次,但是你确实需要知道它会在哪一点。这对每次测试都应该是一样的,所以你需要确定这一点。虽然进行测试,但您还应该确切知道该函数将被调用的次数,因为您应该可以控制整个测试系统,并且可以向其提供能够为您提供具有一致参数的已知数量的调用的数据。 – Schleis

相关问题