【问题标题】:mocking database in derived class在派生类中模拟数据库
【发布时间】:2014-08-26 07:13:13
【问题描述】:

我有实现特定接口并为特定数据库扩展基类的存储库类。

基类:

abstract class CouchDB
{
  protected $db;

  public function __construct(Sag $db)
  {
    $this->db = $db;
  }

  private function call_get($url) {...} //this is a wrapper for $db->get()
}

派生类:

class CouchExpression extends CouchDB implements ExpressionInterface
{
  public function __construct(Sag $db)
  {
    parent::__construct($db);
  }
}

规格:

class CouchExpressionSpec extends ObjectBehavior
{
  public function let($db)
  {
    $db->beADoubleOf('\Sag');

    $this->beConstructedWith($db);
  }

  public function it_gets_returned_by_its_id()
  {
     $this->db->get('...')->willReturn([]);
  }
}

运行 PHPSpec 时,我得到:property db not found 除了将属性设置为public之外,还有其他方法可以解决此问题吗?

设置为public后我得到:call to a member function willReturn() on a non-object. 所以我不能在$this->db上运行->willReturn()

但是为什么呢?在测试的letmethod 中执行此操作时,它可以工作。但并非所有测试都需要返回相同的数据...

我如何让它运行?

【问题讨论】:

    标签: php testing mocking phpspec


    【解决方案1】:

    您可以在没有显式调用的情况下声明您的双重,如下所示:

    function let(\Sag $db)
    {
        $this->beConstructedWith($db);
    }
    

    完成此操作后,如果您将同名属性传递给示例,它将是双精度的相同实例:

    function it_gets_returned_by_its_id($db)
    {
        $db->get('...')->willReturn([]);
    }
    

    此外,按照约定,let 和 example 方法不使用 public 关键字,它们无论如何都是公共的,这样可以减少示例周围的噪音。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多