【发布时间】:2017-04-07 07:15:40
【问题描述】:
我有以下代码:
public function addSomething($paramDto) {
try {
$this->privateMethod($param);
} catch(\Exception $e) {
return ['error' => true, 'messages' => [$e->getMessage()]];
}
return ['error' => false, 'messages' => 'success'];
}
private function privateMethod($param) {
if(!$param) {
throw new \Exception('errorMessage');
}
}
我正在测试 addSomething 方法,catch 块返回什么,我不想测试私有方法。
public function testAddSomethingThrowError($paramDto) {
$param = \Mockery::mock('MyEntity');
$method = new \ReflectionMethod(
'MyService', 'privateMethod'
);
$method->setAccessible(TRUE);
$this->expectException(\Exception::class);
$this->getMyService()
->shouldReceive($method->invoke($param)
->withAnyArgs()
->andThrow(\Exception::class);
$this->getMyService()->addSomething($paramDto);
}
问题是,如果我运行测试,它覆盖了 if 语句中的私有方法并返回异常,但是我的 addSomething 方法中的 catch 方法没有被覆盖,实际上它根本没有覆盖 addSomething 方法。
我正在使用 sebastian bergmann phpunit 框架。
我做错了什么?
【问题讨论】:
-
为什么还要测试私有方法?单元测试应该测试类的公共接口,然后间接测试私有接口。私有方法只是为了让你的代码干净。
-
我不想测试私有方法,我想断言在catch块中返回的消息。
-
您想要“断言公共方法是否正在返回它确实正在返回的消息”。这样做没有任何意义。将您的测试类视为一个黑盒,无法检查其来源。然后根据希望它如何使用它的公共接口工作来进行测试。
-
哦,我明白了。我不知道。感谢您的快速回复。