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的工作。我们是否可以在聊天中继续此操作?>这是一个在单元测试中根本不需要关心的实现细节,这是非常错误的。单元测试意味着对应用程序的内部进行测试。测试“它起作用”称为功能测试。