2011-10-19 18 views
11

Actualmente estoy trabajando en un proyecto que almacena datos confidenciales, y por lo tanto, debe poder borrarlos a petición.PHPUnit: obtener argumentos para una llamada al método simulado

Me gustaría probar que mi entidad (paciente) se guarda en la base de datos con un número de teléfono nulo. Primera idea para hacer eso: obtener el argumento pasado a PatientDao::savePatient(PatientModel $patient), y echar un vistazo a su atributo phoneNumber.

Así que aquí es la interfaz PatientDao:

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

Y el código en mi archivo de prueba:

$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 ? 

¿cómo puedo hacer eso, o hay alguna otra manera de asegurarse de que el paciente se guarda con un nulo número de teléfono?

Respuesta

23

Puede hacer afirmaciones sobre el argumento usando returnCallback(). Recuerde llamar a funciones de declaración estáticamente a través de PHPUnit_Framework_Assert porque no puede usar self dentro de un cierre.

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

Eso debería hacer el truco, ¡muchos gracias! – aspyct

+1

Has trabajado aquí. Nota: si el argumento toma múltiples parámetros, debe incluirlos todos, incluso si no desea probarlos todos. p.ej. '$ this-> returnCallback (function ($ patient, $ someOtherParameter) {})'. – fazy

4

hacer que el método objetos Mock devolver el primer argumento:

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

Luego, puede afirmar que es NULL.

+0

Nunca he usado $ this-> return * en el "con" ... ¡Parece interesante! Pero, ¿cómo puedo obtener el valor en sí más tarde en mi función de prueba, cómo me lo devuelve realmente? – aspyct

+0

¿Estás usando el simulacro para hacer introspección? – hakre

+0

No lo creo ... Supongo que no. – aspyct

5

Aquí está el truco que utilicé. Añadí este método privado a mi clase de prueba:

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

A continuación, cuando la creación de la maqueta:

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

Después de eso, $arg contiene el valor del argumento pasado a la maqueta.

Cuestiones relacionadas