这种做法在phpunit上好吗

这种做法在phpunit上好吗

当我编码时,我经常看到这样的东西:

     testMyMethod() {
        ....
        $mockMyServiceB
            ->expects($this->once())
            ->method('myMethodA')
            ->with(myvalue1, myvalue2, myvalue3)
            ->willReturn($someMockResult);

        $myServiceA = new ServiceA($mockMyServiceB)
        $results = $myServiceA->something();

        $this->assertEquals(['resultA', 'resultB'], results);
     }


不确定,但是我认为随着您编写越来越多的测试,这会使它们快速而又容易地失去可读性。您只是输入了太多信息(期望与回报混合在一起)。对于每个测试,您需要了解参数的顺序,期望,执行的顺序和返回值……。我想的太多了。

我当时正在考虑将代码移至只测试myMethodA正确使用的地方,然后再移至另一个只能关注结果的测试中,如下所示:

  testMyMethodUseServiceBCorrectly() {
      ....
      // this time no WillReturn, just focus on how is used
      $mockMyServiceB
          ->expects($this->once())
          ->method('myMethodA')
          ->with(myvalue1, myvalue2, myvalue3);

      $myServiceA = new ServiceA($mockMyServiceB)
      $myServiceA->something();
 }


  testMyMethodUseServiceResults() {
      ....
      // this time no Expects() or With(), just focus on results
      $mockMyServiceB
          ->method('myMethodA')
          ->willReturn(myvalue1, myvalue2, myvalue3);

      $myServiceA = new ServiceA($mockMyServiceB)
      $this->assertEquals(['resultA', 'resultB'], $myServiceA->something());
 }


我认为这可以清楚说明您要测试的内容,并可以进行较小的测试。但不确定是否也很常见.....是否建议这样做?

最佳答案

您仍然可以使用受保护的方法或私有方法来配置模拟。例如,我们有一个项目,该项目的class BaseTestCase extends TestCase具有基本的createMock($classname)方法,从中扩展了所有单元测试,以便为大多数Mock建筑使用提供一些代码。

只要记住用清晰的变量名和方法名来编写可读的测试代码,并在可能的情况下重用代码。

另外,请记住,如果您的测试越来越大,也许您需要重构您的课程并获得一些简化的服务。

关于php - 这种做法在phpunit上好吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45860513/

10-12 22:15