我正在为一个创建自己的新版本并将其插入数据库的类编写测试。 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函数以返回我的测试数据,但这对我来说似乎不是一个好习惯。
有更好的方法吗?
答案 0 :(得分:0)
new static
正在返回一个新的MockInvoice
,它没有任何与之相关的期望。这就是您的测试不起作用的原因。新对象只是一个裸Mock对象。
我有点困惑为什么要创建一个新的类实例来调用insert
方法。为什么不打电话给$this->insert()
?那么您根本不必担心new static()
。
IMO,必须创建您正在测试的类的模拟不是一个好习惯。您似乎正在向数据库添加数据,我将insert
和update
作为单独类的方法。但是,您的示例代码有点稀疏,无法完全了解您要完成的任务。