PHPUnit存根多个实例化的方法

时间:2014-07-14 10:50:29

标签: php unit-testing phpunit stubbing static-initialization

我正在为一个创建自己的新版本并将其插入数据库的类编写测试。 insert方法返回一个id,我想对原始类进行记录,有点像这样。

class Invoice {

    public function creditInvoice() {
        $credit = new static();
        // ....
        $creditId = $credit->insert();
        $this->credited_by = $creditId;
        $this->update();
        return $credit;
    }

}

我的测试模拟了Invoice类并替换了update和insert。然后它用一个函数替换insert以返回一个id。

class InvoiceTest {

    public function testCreditInvoice {
        $invoice = $this->getMock('Invoice', array('update', 'insert'));
        $invoice->expects($this->any())
                ->method('insert')
                ->will($this->returnValue(1234));

        $credit = $invoice->creditInvoice();
        $this->assertTrue(
            $invoice->credited_by == 1234
        );
    }

}

这失败了。似乎虽然new static()正确地创建了mock类的新版本,但它并没有带有重写方法,因此credited_by实际上是空的。

我见过的唯一可以解决这个问题的建议是创建一个新的测试类,它继承Invoice但重写insert函数以返回我的测试数据,但这对我来说似乎不是一个好习惯。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

new static正在返回一个新的MockInvoice,它没有任何与之相关的期望。这就是您的测试不起作用的原因。新对象只是一个裸Mock对象。

我有点困惑为什么要创建一个新的类实例来调用insert方法。为什么不打电话给$this->insert()?那么您根本不必担心new static()

IMO,必须创建您正在测试的类的模拟不是一个好习惯。您似乎正在向数据库添加数据,我将insertupdate作为单独类的方法。但是,您的示例代码有点稀疏,无法完全了解您要完成的任务。