【问题标题】:Mock non-existing class in PHPUnit 10在 PHPUnit 10 中模拟不存在的类
【发布时间】:2020-03-04 22:29:17
【问题描述】:

在 PHPUnit 10 之前,可以使用下一个代码来模拟不存在的类:

    $this->getMockBuilder('NonExistentClass')
            ->setMethods(['__invoke'])
            ->getMock();

在 PHPUnit 10 中,setMethods() 将被删除:https://github.com/sebastianbergmann/phpunit/issues/3769

新的 MockBuilder API 引入了 addMethods() 方法,该方法内部为 using Reflection,并且不再允许使用不存在的类。

请告知我们如何使用新 API 为不存在的类创建模拟

【问题讨论】:

    标签: phpunit


    【解决方案1】:

    您可以将\stdClass 模拟为基类:

    $mock = $this->getMockBuilder(\stdClass::class)->addMethods(['__invoke'])->getMock();
    

    【讨论】:

      【解决方案2】:

      我完成了下一个解决方案:

      • 在我的tests 文件夹中,我创建了一个空的“物理”类:
      <?php
      
      namespace Tests\Helpers;
      
      class EmptyCallableClass
      {
          public function __invoke()
          {
          }
      }
      
      
      • 然后在我的测试中,我可以像所有其他类一样模拟它(来自 Laravel 的示例):
      <?php
      
      namespace Tests\Unit;
      
      use PHPUnit\Framework\MockObject\MockObject;
      use Tests\Helpers\EmptyCallableClass;
      use Tests\TestCase;
      
      class LravelMiddlewareTest extends TestCase
      {
          /**
           * @var MockObject
           */
          private $closureMock;
      
          public function setUp(): void
          {
              $this->closureMock = $this->createPartialMock(EmptyCallableClass::class, ['__invoke']);
          }
      }
      
      

      【讨论】:

        猜你喜欢
        • 2015-03-23
        • 2014-04-03
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 2015-11-07
        • 1970-01-01
        • 2018-02-08
        相关资源
        最近更新 更多