【发布时间】:2015-08-20 15:09:02
【问题描述】:
我想要一个可以告诉我的模拟对象:
- 当其中一个方法被调用时
- 传递给该方法的参数之一
- 是一个数组
- 并且具有特定的键/值对。
我想用PHPUnit的约束来实现,这个,所以我的测试代码是这样的:
$mock = $this->getMock('\Jodes\MyClass');
$mock->expects($this->once())
->method('myMethod')
->with(
$this->logicalAnd(
$this->isType('array'),
$this->arrayHasPair('my_key', 'my_value'),
)
);
// ... code here that should call the mock method
在this previous SO question 中,这个人最终编写了自己的约束。
我发现this library 似乎实现了很多漂亮的东西。所以我通过在我的 composer.json 的 require 部分添加这一行来安装它:
"etsy/phpunit-extensions": "@stable"
但是当我尝试使用它时,我得到一个错误。我是这样使用的:
class MyClassTest extends PHPUnit_Framework_TestCase {
public function arrayHasPair($key, $value){
return new PHPUnit_Extensions_Constraint_ArrayHasKeyValuePair($key, $value);
}
public function testmyMethod(){
// code as per my example above
}
}
但这会产生这个错误:
PHP 致命错误:在第 50 行调用 C:\MyProject\vendor\etsy\phpunit-extensions\PHPUnit\Extensions\Constraint\ArrayHasKeyValuePair.php 中未定义的方法 PHPUnit_Util_Type::export()
This previous question/answer 解释了问题所在,但我不确定我应该怎么做。这是否意味着该库的开发人员已经放弃了它?有替代品吗?或者我有什么选择来修复它?我很惊讶这样的基本约束在 PHPUnit 中仍然不存在。显然我可以编写自己的约束,但肯定没有必要吗?
【问题讨论】:
-
谢谢,看起来很棒!现在试试看。
-
@Simba,你知道我如何使用 mockery/hamcrest 来测试一个参数是否是一个包含键/值对的数组吗?我是否需要编写一个查找该对的闭包?
标签: php phpunit constraints