Php 测试调用父::函数的类?
我有一个重载Php 测试调用父::函数的类?,php,inheritance,phpunit,laravel-4,mockery,Php,Inheritance,Phpunit,Laravel 4,Mockery,我有一个重载where函数的模型 我的重载方法如下所示: public function where($column, $operator = null, $value = null, $boolean = 'and') { if (in_array($column, $this->metaFields)) { $value = '%"' . $column . '":"' . $value . '"'; $column = 'me
where
函数的模型
我的重载方法如下所示:
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
if (in_array($column, $this->metaFields))
{
$value = '%"' . $column . '":"' . $value . '"';
$column = 'meta';
$operator = 'like';
}
return parent::where($column, $operator, $value, $boolean);
}
现在我正在使用phpunit和mockry测试这个类,我需要测试重载的where函数,我真正关心的是传递给parent::where()的值是什么
我的问题是,我是否可能/如何模拟父类,以便我可以这样做
$metaField = 'colour';
$value = 'blue';
//on the parent
->shouldReceive('where')->with(['meta', 'like', '%"colour":"blue"%'])->once();
//on the model I am testing
$model->where('colour', 'blue');
我真正关心的是传递给parent::where()的值是什么
不,你没有。这是一个在单元测试中根本不需要关心的实现细节。放松点
编辑:这不是开玩笑的,但是如果您的设计需要这样做,那么您应该更喜欢组合而不是继承,这样您就可以模拟“父级”并将其注入,从而测试这样的期望。根据定义,mocky中mock的父级是类,因此本例中的父级是具有重载方法的类,而不是它的父级。你不能用mocky来模拟“parents”(我知道,也不能用任何其他PHP模拟库来模拟)。我们之所以使用这种方法,是因为我们在meta
列中存储的元信息实际上并不保证它自己的列是json blob。这个函数应该允许我们成功地查询元列,就像它们是实列一样。所以我认为这是值得测试的东西?你能告诉我为什么我不需要测试它吗?(不是我的否决票,顺便说一句)只测试公共接口,在本例中是返回值。只需使用一些边界值进行测试,以便在不信任编写代码的情况下捕获错误情况。此外,您应该在实现例程之前写下失败,这样您就不会在之后感到如此奇怪了。例如,如果父类有它的单元测试,并且所有测试都通过了,那么您只需要在此处测试附加功能,即您可以调用该方法并返回预期结果。关于原因:where方法检索返回值的方式对于应用程序的其余部分不感兴趣。只有这样它才有效。因此,您不需要测试实现细节。例如,您不需要测试in_array()是否工作,例如,这是PHP QC的工作。我们是否可以在聊天中继续此操作?>这是一个在单元测试中根本不需要关心的实现细节,这是非常错误的。单元测试意味着对应用程序的内部进行测试。测试“它起作用”称为功能测试。