2011-10-19 30 views
11

Tôi hiện đang làm việc trên một dự án lưu trữ dữ liệu nhạy cảm và do đó có thể xóa chúng theo yêu cầu.PHPUnit: nhận đối số cho một phương thức giả gọi

Tôi muốn kiểm tra xem thực thể (bệnh nhân) của tôi có được lưu vào cơ sở dữ liệu bằng số điện thoại không. Ý tưởng đầu tiên để làm điều đó: lấy đối số được chuyển đến PatientDao::savePatient(PatientModel $patient) và xem xét thuộc tính phoneNumber của nó.

Vì vậy, đây là giao diện PatientDao:

interface PatientDao { 
    function savePatient(PatientModel $patient); 
} 

Và mã trong tập tin thử nghiệm của tôi:

$this->patientDao     // This is my mock 
      ->expects($this->once()) 
      ->method('savePatient'); // savePatient() must be called once 

$this->controller->handleMessage(...); 

$patient = ??; // How can I get the patient to make assertions with it ? 

Làm thế nào tôi có thể làm điều đó, hoặc là có cách nào khác để đảm bảo bệnh nhân được lưu với một số điện thoại null?

Trả lời

23

Bạn có thể xác nhận đối số bằng cách sử dụng returnCallback(). Hãy nhớ gọi các hàm xác nhận tĩnh qua PHPUnit_Framework_Assert vì bạn không thể sử dụng self bên trong một đóng.

$this->patientDao 
     ->expects($this->once()) 
     ->method('savePatient') 
     ->will($this->returnCallback(function($patient) { 
      PHPUnit_Framework_Assert::assertNull($patient->getPhoneNumber()); 
     })); 
+0

Điều đó nên làm các trick, nhiều thx! – aspyct

+1

Đã làm việc ở đây. Lưu ý: nếu đối số có nhiều tham số, bạn cần phải bao gồm tất cả, ngay cả khi bạn không muốn kiểm tra tất cả. ví dụ. '$ this-> returnCallback (hàm ($ patient, $ someOtherParameter) {})'. – fazy

4

Tận dụng phương pháp đối tượng Mock trả lại số đầu tiên:

$this->patientDao     // This is my mock 
      ->expects($this->once()) 
      ->method('savePatient') // savePatient() must be called once 
      ->with($this->returnArgument(0)); 

Sau đó bạn có thể khẳng định rằng đó là NULL.

+0

Tôi chưa bao giờ sử dụng $ this-> return * trong "with" ... Có vẻ thú vị! Nhưng làm thế nào tôi có thể nhận được giá trị chính nó sau này trong chức năng kiểm tra của tôi, làm thế nào là nó thực sự trở lại với tôi? – aspyct

+0

Bạn đang sử dụng mô hình để làm nội tâm? – hakre

+0

Tôi không nghĩ vậy ... tôi đoán là không. – aspyct

5

Đây là mẹo tôi đã sử dụng. Tôi thêm phương pháp tin này đến lớp thử nghiệm của tôi:

private function captureArg(&$arg) { 
    return $this->callback(function($argToMock) use (&$arg) { 
     $arg = $argToMock; 
     return true; 
    }); 
} 

Sau đó, khi thiết lập các mô hình:

$mock->expects($this->once()) 
    ->method('someMethod') 
    ->with($this->captureArg($arg)); 

Sau đó, $arg chứa giá trị của đối số truyền cho các mô hình.

Các vấn đề liên quan