我正在为一个接受“搜索”类的类创建测试,该类使用搜索字符串搜索超市,并有一个返回相应项目的方法“getItem($itemNo)”。
所以,有点像这样:
class MyClass
{
public function __construct(Search $search) {
$item0 = $search->getItem(0);
$item1 = $search->getItem(1);
// etc... you get the picture
}
}
我想模拟这个搜索类,因为我不想每次做测试时都搜索超市。
所以我写了:
class MyClassTest extends PHPUnit_Framework_TestCase
{
public function setUp()
{
$searchResults=$this->getMockBuilder('Search')
//Because the constructor takes in a search string:
->disableOriginalConstructor()
->getMock();
$pseudoSupermarketItem=array( "SearchResult1", "SearchResult2", etc...);
$this->searchResult
->expects($this->any())
->method('getItem')
->with(/*WHAT DO I PUT HERE SO THAT THE METHOD WILL TAKE IN A NUMBER*/)
->will($this->returnValue($pseudoSupermarketItem[/* THE NUMBER THAT WAS PUT IN */]));
}
}
如您在代码中所见,我希望 mock 方法接受一个整数,如 MyClass 中所示,然后它将返回相应的 pseudoSupermarketItem 字符串。到目前为止,我不确定如何实现这一点,感谢任何帮助!
最佳答案
这应该适合你:
$this->searchResult
->expects($this->any())
->method('getItem')
->with($this->isType('integer'))
->will($this->returnCallback(function($argument) use ($pseudoSupermarketItem) {
return $pseudoSupermarketItem[$argument];
});
此外,您可能会发现它很有用(使用 onConsecutiveCalls
):
http://phpunit.de/manual/3.7/en/test-doubles.html#test-doubles.stubs.examples.StubTest7.php
第三种方式是这样的:
$this->searchResult
->expects($this->at(0))
->method('getItem')
->with($this->equalTo(0))
->will($this->returnValue($pseudoSupermarketItem[0]);
$this->searchResult
->expects($this->at(1))
->method('getItem')
->with($this->equalTo(1))
->will($this->returnValue($pseudoSupermarketItem[1]);
// (...)
关于PHPUnit:模拟一个接受参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789435/