【问题标题】:Try catch private method phpunit symfony尝试捕获私有方法 phpunit symfony
【发布时间】: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块中返回的消息。
  • 您想要“断言公共方法是否正在返回它确实正在返回的消息”。这样做没有任何意义。将您的测试类视为一个黑盒,无法检查其来源。然后根据希望它如何使用它的公共接口工作来进行测试。
  • 哦,我明白了。我不知道。感谢您的快速回复。

标签: php symfony phpunit


【解决方案1】:

正确答案应该是 Jakub Matczak 的答案:

“您想“断言公共方法是否正在返回它确实正在返回的消息”。这样做没有任何意义。将您测试的类视为一个黑盒,无法检查其来源。然后根据如何让它使用它的公共接口工作。"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2023-03-28
    • 2020-09-03
    相关资源
    最近更新 更多