我有一个要测试的课程。此类使用另一个类别的即时消息:通知发送者。在单元测试中,由于没有注册的电话,因此通知无法正常成功进行。
如何在不直接评估对象的情况下覆盖或模拟测试目标所拥有对象的方法?
下面是我要处理的课程的概述。
我要测试的班级:
class MyClass
{
private $notifier; // Has to be private for the sake of this example
public function __construct()
{
$this->notifier = new Notifier();
}
public function execute()
{
return $this->notifier->send(); // Will always return false in test environment because devices are not registered in external service
}
}
测试:
setUp()
{
}
testExecute()
{
$result = $this->post('/my-page'); // Perform a POST request. The return is actually of `MyClass->execute()`, but it's wrapped by the page controller
$this->assertTrue($result); // Will fail in test environment
}
测试时,我希望方法Notifier->send()
总是返回true
,而不做任何事情。
这是CakePHP 3项目的一部分,尽管我认为应该普遍回答这个问题。
一个类似的问题,尽管我不确定答案是否适用:PHPUnit - How to mock the class inside another class's method?