如何模拟类的__construct引发的异常

时间:2018-07-24 13:54:08

标签: php phpunit phpunit-testing

想象一个A级,指示B级。 我正在尝试为A类编写一个测试并模拟B的行为。

B被证明可能会引发一些异常,这就是我想用phpunit模拟以便正确测试A的原因。

是否可以通过某种方式模拟魔术函数__construct

2 个答案:

答案 0 :(得分:1)

不具有PHPUnit的模拟功能。您需要在测试中重新定义该类,以便B的__construct引发异常。否则可能会导致稍后尝试测试B或由于已经定义了类而实际构造B时引发错误。这些困难是代码的味道,您的代码没有经过最佳设计。

您应该做的是将B传递给A的__construct方法。这是依赖注入。因此,您将创建一个B的模拟并将其传递给A。这很清楚,因为如果B的__construct抛出异常,这是B而非A的问题。通常,应避免使用{{1 }},然后将它们传入(除了Factory类)。

答案 1 :(得分:1)

我认为您对类的设计不好,并且类的测试用例必须始终与类本身相关:您不应在针对类A的测试中对类B进行测试。

PHPUnit无法实现这种类型的测试,但是您可以使用另一个库(Mockery),该库可以帮助您测试这种依赖关系。使用Mockery,您可以执行以下操作:

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('name_of_method_1')
    ->once()
    ->with($arg1)
    ->andReturn('return value');