PHPUnit:模拟一个接受参数的方法

标签 php unit-testing phpunit

我正在为一个接受“搜索”类的类创建测试,该类使用搜索字符串搜索超市,并有一个返回相应项目的方法“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/

相关文章:

Laravel 5.5 PHPunit测试- "A facade root has not been set."

unit-testing - 如何使用Moq来模拟StackExchange.Redis库抛出的异常?

unit-testing - 我应该打扰单元测试我的存储库层吗

php - 如何防止 Laravel event() 在单元测试期间触发

php - 在我的页面中添加 head 部分的 php include 是一种好习惯吗?

unit-testing - 如何在 Python 中模拟 sqlite3.connect

php - 用于模拟由新类对象调用的方法的单元测试

php - 存储数据用mysql好还是文件好?

php - 更改 OpenCart 中的过滤行为

由于浏览器缓存,PHP header 301 重定向不起作用