带有接口

时间:2017-05-17 07:12:33

标签: php testing phpunit instance

我有一个名为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并传递我的测试用例。

2 个答案:

答案 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方法。