【发布时间】:2014-09-04 06:31:00
【问题描述】:
我正在为一个创建自身新版本并将其插入数据库的类编写测试。 insert 方法返回一个 id,我想将它记录在原始类中,有点像这样。
class Invoice {
public function creditInvoice() {
$credit = new static();
// ....
$creditId = $credit->insert();
$this->credited_by = $creditId;
$this->update();
return $credit;
}
}
我的测试模拟了 Invoice 类并替换了更新和插入。然后它用一个函数替换 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实际上是null。
我看到的唯一可以解决这个问题的建议是创建一个新的测试类,它继承 Invoice 但覆盖插入函数以返回我的测试数据,但这对我来说似乎不是一个好习惯。
有没有更好的办法?
【问题讨论】:
-
如果人们认为
new static()是不好的做法,我可以更改正在测试的代码。 -
我通过使用依赖注入解决了这个问题,但是将一个对象传递给它自己的类的另一个实例,它也需要为空,对我来说似乎并不是一个好的编码实践(也许我'我错了)。如果有人有不涉及改变问题背景的解决方案,那么听到它仍然很棒。
标签: php unit-testing phpunit stubbing static-initialization