1

我有这堂课:

class PagSeguro {

    public function pay()
    {
        if ( ! $this->checkAllData() )
        {
            return false;
        }

        return $this->buildPaymentURL();
    }

    private function checkAllData()
    {
        return true;
    }

    private function buildPaymentURL()
    {
        echo "not cool!\n\n";

        return true;
    }

}

而这个测试:

public function testPagSeguroPaymentData()
{
    $m = m::mock('PagSeguro[buildPaymentURL]');

    $m->shouldReceive('buildPaymentURL')
        ->once()
        ->andReturn('http://');

    $this->assertEquals($m->pay(), 'http://');
}

如果我 var_dump($m) 我看到模拟的方法:

    'buildPaymentURL' =>
    class Mockery\ExpectationDirector#1507 (5) {
      protected $_name =>
      string(15) "buildPaymentURL"
      protected $_mock =>
              ...

      protected $_expectations =>
      array(1) {
        ...
      }
      protected $_expectedOrder =>
      NULL
      protected $_defaults =>
      array(0) {
        ...
      }
    }
  }

但是当测试执行时,它调用的不是模拟的,而是真实的。除非我重命名

private function buildPaymentURL_RENAMED() {}

然后我得到一个绿色。

任何人都可以向我展示使用 Mockery 进行部分模拟的正确方法吗?

4

1 回答 1

4

我认为您不能使用该方法private,因为在您输入真实对象的代码时,对的任何调用都$this->buildPaymentURL必须以该真正的私有方法结束。

使其受到保护。这样,模拟可以扩展您的类并覆盖该函数。

另一方面,如果需要这种部分模拟,我总是有一种不好的感觉。它们很可能是糟糕设计的标志。似乎这个私有方法应该包含在它自己的一个专门处理 URL 创建的对象中(并且可以单独测试),并且您现在正在测试的这个类应该只获得注入的新类的完整模拟。

于 2013-07-29T20:57:44.013 回答