想象一个A级,指示B级。 我正在尝试为A类编写一个测试并模拟B的行为。
B被证明可能会引发一些异常,这就是我想用phpunit模拟以便正确测试A的原因。
是否可以通过某种方式模拟魔术函数__construct
?
答案 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');