我有一个PHP类,它使用静态工厂方法来实例化我的类的一个成员。在这个方法中,我调用了另一个类的构造函数,这个构造函数可能会抛出一个异常,由我来处理。我想用PHPUnit有效地测试这个静态方法。下面是描述我的流程的一些伪代码。
class A {
static function create() {
$a = new A();
try {
$b = new B(); // could throw exception
} catch(\Exception $e) {
handle and return something else here;
}
$a->setB($b);
return $a;
}
}我知道使用带有PHPUnit的test doubles在我正在模拟的对象上创建方法存根。但是,我不知道如何模拟构造函数本身,因为这将是类本身的一个“魔术”方法。
发布于 2020-04-13 02:42:02
当你想要从一个类创建一个mock,并期望一个特定的方法时,可以为你做一些事情。应该是这样的
$this->getMockBuilder(B::class)
->disableOriginalConstructor()
->setMethods(['sth'])
->getMock();
$mock->expects($this->once())->method('sth')->withAnyParameters()->willThrowException(new \Exception());但是我从来没有遇到过这种情况,当我创建一个新的实例时,我的代码会抛出一个错误。即使你遇到了这种情况,你也不应该模仿B类,而应该模仿B类的构造函数中抛出错误的代码。例如,如果你有一个PDO连接,那么你应该做一些关于模拟它的事情,或者假设你有curl_init,那么你应该模拟它。
https://stackoverflow.com/questions/60894976
复制相似问题