当我使用$ this-> at(0)而不是$ this-> once()时,我的测试失败了。我肯定在这里错过了一点,但我不知道是什么。谁知道那可能是什么?
/**
* Passes
*/
public function testOne()
{
$expected = array(
'id' => 1,
'name' => 'Product Name'
);
$mock = $this->getMock('WS');
$mock->expects($this->once())
->method('getProductInfo')
->with($this->equalTo(1))
->will($this->returnValue($expected));
$this->object->setWs($mock);
// same as $mock->getInfo(1)
$returned = $this->object->getWs()->getProductInfo(1);
$this->assertEquals($expected, $returned);
}
/**
* Fails
*/
public function testOne()
{
$expected = array(
'id' => 1,
'name' => 'Product Name'
);
$mock = $this->getMock('WS');
$mock->expects($this->at(0)) // all that changed
->method('getProductInfo')
->with($this->equalTo(1))
->will($this->returnValue($expected));
$this->object->setWs($mock);
// returned equals NULL
// same as $mock->getInfo(1)
$returned = $this->object->getWs()->getProductInfo(1);
$this->assertEquals($expected, $returned);
}
答案 0 :(得分:1)
我只能猜测,因为我无法查看setWs
,但唯一的区别是->at(0)
总是尝试匹配FIRST函数调用模拟对象,也许WS
的构造函数{1}}已经调用了某些内容(例如)。
在没有可执行测试用例的情况下,我不能说更具体的事情可能是一般性的:
使用PHPUnit Mocking API的当前功能,不需要每次使用->at(0)
。我现在可以使用->at()
以及->will($this->logicalOr(...)
或->returnCallback()
更好地表达使用->returnValueMap()
的所有内容。 See this example for at vs returnCallback
因此,如果您没有特定需要(!)的用例,以确保方法调用是正确的,我不会担心它:)
<?php
class ClassToTest
{
public function willGetCalled($value) {}
}
class TestClass extends PHPUnit_Framework_TestCase
{
public function testWithExplicitMock()
{
$mock = $this->getMock(
'ClassToTest'
);
$mock->expects($this->at(0))
->method('willGetCalled')
->with(5);
$mock->willGetCalled(5);
}
}