带有数组和 $this->anything() 的 PHPUnit "with" 匹配器

PHPUnit "with" matcher with array and $this->anything()

我有一个单元测试测试 PDOStatement::execute() 调用,其中 date() 作为数组元素之一。

类似于:

$stmt->execute(array ('value1', 'value2', date('Ymd'));

问题是我的断言是使用 $this->anything() 来表示该日期函数结果。我认为它正在崩溃,因为它在一个数组中。有什么好的方法来处理吗?

我的断言如下:

$mock->expects($this->once())
  ->method('execute')
  ->with(array ('value1', 'value2', $this->anything()));

您不能将参数验证方法传递给数组内的 with()。 PHPUnit 需要迭代数组并检测方法。相反,这些方法之一被传递给方法应接收的每个参数的 with() 方法。

在您的情况下,该方法将接收单个参数,因此您将使用单个验证。您不能使用通用验证,因此您需要使用回调检查数组内部结构:

$mock->expects($this->once())
     ->method('execute')
     ->with($this->callback(function($array) {
            return 'value1' == $array[0] && 'value2' == $array[1] && 3 == count($array);
        }));

这在 PHPUnit docs 中有解释。