我有一个名为Service的模型,它从构造函数中的configInterface创建一个对象。
public $config;
public function __construct( \Vendor\Module\Api\Config $config){
$this->config = $config;
}
并使用以下方法
public function Foo(){
$bar = $this->config->Bar();
return 'Config bar = '.$bar;
}
在我的Unittest setUp()中,我为我的服务
创建了一个这样的模拟对象 $this->serviceMock = $this->getMock(
'Vendor\Module\Model\Service',
['create'],
[''],
'',
true
);
这会给我一条__construct() must be an instance of Vendor\Module\Api\Config
知道如何在我的服务模拟对象中添加配置界面吗?我尝试为我的配置界面创建一个新的对象mockobject并将其传递给我的服务对象但是这将返回$bar = $this->config->Bar();
null并传递我的测试用例。
答案 0 :(得分:2)
为方便起见,我总是使用这种形式的模拟:
$this->getMockBuilder('Foo\Bar')
->disableOriginalConstructor()
->getMock();
答案 1 :(得分:0)
PHPUnit的getMock方法的第三个参数是应该传递给构造函数的参数。在您的情况下,您传递一个空字符串。这肯定与构造函数中的类型提示不匹配。所以模拟结构将失败。
要解决此问题,您可以创建\Vendor\Module\Api\Config
对象的模拟并将其放在数组中。
您在getMock方法中使用的最后一个参数是$ callOriginalConstructor。将此设置为false也可以解决您的问题。
$this->serviceMock = $this->getMock(
'Vendor\Module\Model\Service',
['create'],
[''],
'',
false,
);
<强> FYI 强>
这种在PHPUnit中创建模拟对象的方法已被弃用。在当前版本(6.1)中,执行此操作的方法是:
$this->serviceMock = $this->createMock('Vendor\Module\Model\Service');
或
$this->serviceMock = $this->getMockBuilder('Vendor\Module\Model\Service')
->setMethods(['create'])
->disableOriginalConstructor()
->getMock();
两者都不会调用被模拟的类的__construct
方法。