Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
phpunit with mockry-如何使用正确的参数来测试模拟对象_Php_Unit Testing_Phpunit_Mockery - Fatal编程技术网

phpunit with mockry-如何使用正确的参数来测试模拟对象

phpunit with mockry-如何使用正确的参数来测试模拟对象,php,unit-testing,phpunit,mockery,Php,Unit Testing,Phpunit,Mockery,所以我正在为一个PHPAPI消费者库编写测试。在其中一个主要库中,我拥有以下主要功能: public function __call($name, $args) { return new Schema($name, $this); } 在我的测试中,我使用了嘲弄,并做了如下操作: $schemaMock = m::mock('overload:Mynamespace\Schema'); 这是使用模拟正确地重载我的模式类。因此,稍后我会: $myclass->movies()

所以我正在为一个PHPAPI消费者库编写测试。在其中一个主要库中,我拥有以下主要功能:

public function __call($name, $args) {
    return new Schema($name, $this);
}
在我的测试中,我使用了嘲弄,并做了如下操作:

$schemaMock = m::mock('overload:Mynamespace\Schema');
这是使用模拟正确地重载我的模式类。因此,稍后我会:

$myclass->movies()
它应该调用
\u call
方法,从而调用模拟的
模式
类。到目前为止,这一切似乎都很好,但我想断言,$schemaMock是用函数名构造的,在本例中,
movies
以及传入的类的实例。我试过的是:

$schemaMock->shouldReceive('__construct')->with('movies');

但是,无论“with”函数参数的状态如何,我的测试都会通过。IE我可以将
movies
更改为
foobar
,测试仍然通过。我确信我遗漏了一些关于如何运行这些断言的简单内容。谢谢你的帮助

简短的最终答案:你不能。

模拟是通过拼凑新类的代码来定义的。它包含所有模拟方法的方法,对于所有其他方法,它是一个子类,将原始类实现为其父类。mock类不包含构造函数-对于普通mock对象,将调用父对象。这就是传递给
mockry::mock($class$args)
的构造函数参数的方式

但对于mock,需要一个复制mock的构造函数。它隐藏在源代码的深处,但是如果您查看
mockry/library/mockry/Generator/StringManipulation/Pass/InstanceMockPass.php
,您会发现该方法的唯一目的是将属性和期望复制到新实例。参数完全被忽略

您可以得到的最佳近似方法是将实例化调用封装在一个可模仿的方法中,该方法除了使用该方法的参数创建实例外,什么都不做,如:

或者将实际实例化任务从构造函数委托给可模拟方法:

class Schema {

    public function __construct () {
        call_user_func_array( array( $this, 'init' ), func_get_args() );
    }

    public function init ($name, $obj) {
        //...
    }
}

简短的最终答案:你不能。

模拟是通过拼凑新类的代码来定义的。它包含所有模拟方法的方法,对于所有其他方法,它是一个子类,将原始类实现为其父类。mock类不包含构造函数-对于普通mock对象,将调用父对象。这就是传递给
mockry::mock($class$args)
的构造函数参数的方式

但对于mock,需要一个复制mock的构造函数。它隐藏在源代码的深处,但是如果您查看
mockry/library/mockry/Generator/StringManipulation/Pass/InstanceMockPass.php
,您会发现该方法的唯一目的是将属性和期望复制到新实例。参数完全被忽略

您可以得到的最佳近似方法是将实例化调用封装在一个可模仿的方法中,该方法除了使用该方法的参数创建实例外,什么都不做,如:

或者将实际实例化任务从构造函数委托给可模拟方法:

class Schema {

    public function __construct () {
        call_user_func_array( array( $this, 'init' ), func_get_args() );
    }

    public function init ($name, $obj) {
        //...
    }
}