【问题标题】:Mock a class's constant and method with Mockery and PHPUnit用 Mockery 和 PHPUnit 模拟一个类的常量和方法
【发布时间】:2021-06-23 15:57:20
【问题描述】:

Mockery 的新手...我正在测试一个类(在我过于简单的平淡示例中是 Buzz),它调用另一个类(Foo->getData)的方法,并且我有一个模拟这个方法的模拟效果很好。现在我添加了对类常量(Foo::FIZZ)的检查,并且由于未定义常量而导致我的测试中断。

我尝试通过映射常量来添加常量,如Mockery Docs here 所示,但它仍然说常量 FOO\Bar::FIZZ 未定义。我还没有找到任何其他方法来为我的 Mockery 模拟设置常量。任何帮助将不胜感激!

约束:由于模拟类中的一些hard dependencies,我必须使用重载模拟。

namespace Foo; 

class Bar() {
  const FIZZ = 'hello';

  public function getData() {
    //retrieve $data from database
    return $data;
  }
}

class Buzz() {

  public function returnResult() {
    $result = Foo\Bar->getData();
    if ($result !== Foo\Bar::FIZZ) { // if result is different than my constant, return it
      return $result;
    }
    return false;
  }
}

在我的测试中:

use PHPUnit\Framework\TestCase;
use Mockery;
use Foo;

class BuzzTest extends TestCase {

   \Mockery::getConfiguration()->setConstantsMap([
    'Bar' => [
        'FIZZ' => 'hello',
    ]
  ]);

  public function testBuzzRejectsIfEqual(): void {

        $externalMock = \Mockery::mock('overload:\Foo\Bar')
            ->shouldReceive('getData')
            ->andReturn('hello');

        $obj = new \Foo\Buzz();
        $actual = $obj->returnResult();
        $this->assertEquals($actual, false);
  }
}

【问题讨论】:

    标签: unit-testing phpunit mockery


    【解决方案1】:

    感谢这篇精彩的文章 https://blog.gougousis.net/mocking-static-methods-with-mockery/ 我终于能够使用命名模拟来完成这项工作。

    use PHPUnit\Framework\TestCase;
    use Mockery;
    use Foo;
    
    class BuzzTest extends TestCase {
    
    
      public function testBuzzRejectsIfEqual(): void {
    
            $externalMock = \Mockery::namedMock(Foo\Bar:class, BarStub::class)
                ->shouldReceive('getData')
                ->andReturn('hello');
    
            $obj = new \Foo\Buzz();
            $actual = $obj->returnResult();
            $this->assertEquals($actual, false);
      }
    }
    
    class BarStub {
      const FIZZ = 'hello';
    }
    

    【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2015-04-09
    • 2018-05-26
    • 2016-01-14
    • 2013-03-24
    • 2016-09-17
    • 1970-01-01
    • 2016-07-22
    • 2016-04-21
    相关资源
    最近更新 更多