【问题标题】:Disable a method in a class that is NOT mocked禁用未模拟的类中的方法
【发布时间】:2021-03-02 00:32:11
【问题描述】:

我有一个带有解析器的简单类

class Parser
{
    public function __construct(P1 $p1, P2 $p2)
    {
        $this->p1 = $p1;
        // etc...
    }

    public function parse()
    {
        $this->doSomething1();
        return $this->doSomething2(P3 $p3);
    }
}

然后我有我的测试课

class ParserTest
{
    public function testParse()
    {

      $p1 = $this->getMockBuilder(P1::class)->disableOriginalConstructor()->getMock();
      $p2 = $this->getMockBuilder(P2::class)->disableOriginalConstructor()->getMock();
      $p3 = $this->getMockBuilder(P3::class)->disableOriginalConstructor()->getMock();
     
      $parser = new Parser ($p1, $p2);
      $result = $parser->parse($p3);

    }
}

我需要为测试禁用 doSomething1,因为它基本上是在进行 API 调用,所以我可以测试结果。我该怎么做?

【问题讨论】:

  • 这是您需要重构代码的标志。解析器不应该通过 API 获取数据,它应该只解析给定的数据。将提取提取到单独的服务类并将其结果作为参数传递给parse 方法是明智的。
  • 是的,我怀疑我必须这样做,我只是在徘徊,那里有更快的方法。还是谢谢。
  • 哪个可见性有doSomething1方法?也许您可以使用部分模拟...

标签: php phpunit php-7


【解决方案1】:

您可以使用正在测试的类的 PHPUnit 部分模拟(我没有找到有效的文档,只有一些 PR 或源代码),例如:

    $methods = ["doSomething1"];


    $parser = $this->getMockBuilder(Parser::class)
        ->disableOriginalClone()
        ->disableArgumentCloning()
        ->disallowMockingUnknownTypes()
        ->onlyMethods($methods)
        ->setConstructorArgs([$p1, $p2])
        ->getMock();

注意:因为需要在构造函数中传递数据,所以不能使用短猫版本:

    $this->createPartialMock(Parser::class, $methods);

【讨论】:

    【解决方案2】:

    正如 El_Vanja 已经建议的那样,最好提取该 API 调用。如果你现在做不到,你可以重写doSomething1 方法进行测试:

    class ParserTest
    {
        public function testParse()
        {
          $p1 = $this->getMockBuilder(P1::class)->disableOriginalConstructor()->getMock();
          $p2 = $this->getMockBuilder(P2::class)->disableOriginalConstructor()->getMock();
          $p3 = $this->getMockBuilder(P3::class)->disableOriginalConstructor()->getMock();
         
          $parser = new class($p1, $p2) extends Parser {
                protected function doSomething1()
                {
                }
          };
    
          $result = $parser->parse($p3);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多