새로운 버전의 자체를 생성하고 데이터베이스에 삽입하는 클래스의 테스트를 작성하고 있습니다. insert 메소드는 원본 클래스에 대해 이처럼 약간 기록하고자하는 id를 반환합니다.PHPUnit가 여러 인스턴스화를위한 메소드 스터 빙
class Invoice {
public function creditInvoice() {
$credit = new static();
// ....
$creditId = $credit->insert();
$this->credited_by = $creditId;
$this->update();
return $credit;
}
}
내 테스트는 송장 클래스를 조롱하고 업데이트 및 삽입을 대체합니다. 그런 다음 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()'이 나쁜 습관이라고 생각한다면 테스트중인 코드를 변경할 수 있습니다. – DanielM
나는 의존성 주입을 사용하여 문제를 해결했다. 그러나 객체를 전달하는 것은 자신의 클래스도 빈 상태 여야하고, 실제로 나에게 좋은 코딩 방법처럼 보이지 않는다. (아마도 나는 틀렸다). 문제의 상황을 변화시키지 않는 해결책이있는 사람이라면 누구나 그 의견을 듣는 것이 좋습니다. – DanielM