使用phpunit模拟函数调用参数列表中的接口实例化

时间:2018-02-27 12:29:11

标签: php testing interface phpunit

我对phpunit有点新鲜。我试图覆盖这个功能。

public function add(AddressInterface $address) : array
{
    $this->data[] = $address;
    return $this->data;
}

我的测试功能如下

public function testAdd()
{
    $collection = new AddressCollection();
    $collection->add($this->createMock(AddressInterface::class));
}

并且名称空间相同。但每当我尝试运行phpunit时,我都会收到此错误。 TypeError: Argument 1 passed to ValidateAddress\Model\AddressCollection::add() must be an instance of AddressInterface, instance of Mock_AddressInterface_65a1b00b given, called in validateaddress/tests/Model/AddressCollectionTest.php

知道为什么会这样吗?模拟的实例不能替换原始add()函数版本中的AddressInterface实例。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

有时,你可以尝试模拟太多 - 如果实现AddressInterface的类不是那么复杂,大多只是持有值,那么使用真实实例就完全没问题 - 特别是因为你有的代码实际上只是一个setter函数。

测试会创建一个足够实用的Address,告诉AddressCollection将其添加到数据中,并声明返回的数组包含与传递的地址相同的地址,或至少一个比以前更多了。

所有这一切,我做了一些模拟类,或者接口到PHP7.2,PHPUnit7的构造函数,并且在我测试的同时还在文件顶部设置declare(strict_types=1);。< / p>