PHPUnit为一个参数断言带有多个stringContains的mock方法

时间:2014-03-26 21:11:37

标签: php unit-testing phpunit

有没有办法为多个匹配断言模拟类方法字符串参数?

$this->getMock()
     ->expects($this->any())
     ->method('setString')
     ->with($this->stringContains('word3'))
     ->will($this->returnSelf());

此示例将传递给 - > setString(' word1 word2 word3 word4')

如果使用包含' word1'的参数调用setString(),我需要做的是匹配AND' word3'

但是

$this->getMock()
     ->expects($this->any())
     ->method('setString')
     ->with(
         $this->stringContains('word1'),
         $this->stringContains('word3')
     )
     ->will($this->returnSelf());

这个实现正在检查setString()的2个参数,这不是我打算检查的。

想法?使用$ this-> callback()?有没有更合适的PHPUnit断言?

2 个答案:

答案 0 :(得分:4)

我知道这个答案已经很晚了,但我遇到了同样的问题,并找到了一个似乎更聪明的解决方案...... :)

试试这个:(未经测试的情况下)

$this->getMock()
     ->expects($this->any())
     ->method('setString')
     ->with($this->logicalAnd(
          $this->stringContains('word1'),
          $this->stringContains('word3')
      ))
     ->will($this->returnSelf());

答案 1 :(得分:1)

我想这会做你想要的:

$this->getMock()
->expects($this->any())
->method('setString')
->with(
    $this->callback(
        function($parameter) {
            $searchWords = array('word1', 'word3');
            $matches     = 0;

            foreach ($searchWords as $word) {
                if (strpos($parameter, $word) !== false) {
                    $matches++;
                }
            }

            if ($matches == count($searchWords)) {
                return true;
            } else {
                return false;
            }
        }
))
->will($this->returnSelf());

回调函数检查来自$ searchWords数组的两个值是否都是传递给setString()方法的第一个参数的一部分。