Tengo un objeto simulado PHPUnit que devuelve 'return value'
sin importar sus argumentos:
// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
->method('methodToMock')
->will($this->returnValue('return value'));
Lo que quiero poder hacer es devolver un valor diferente en función de los argumentos pasados al método simulado. He intentado algo como:
$mock = $this->getMock('myObject', 'methodToMock');
// methodToMock('one')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('one'))
->will($this->returnValue('method called with argument "one"'));
// methodToMock('two')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('two'))
->will($this->returnValue('method called with argument "two"'));
Pero esto hace que PHPUnit se queje si no se llama al simulacro con el argumento 'two'
, por lo que supongo que la definición de methodToMock('two')
sobrescribe la definición del primero.
Entonces mi pregunta es: ¿hay alguna forma de obtener un objeto simulado PHPUnit para devolver un valor diferente en función de sus argumentos? Y si es así, ¿cómo?
fuente
$this->returnCallback(array('MyClassTest','myCallback'))
.$this->returnCallback(function() { // ... })
De los últimos documentos de phpUnit: "A veces, un método con código auxiliar debería devolver valores diferentes según una lista predefinida de argumentos. Puede usar returnValueMap () para crear un mapa que asocie argumentos con los valores de retorno correspondientes".
fuente
Tuve un problema similar (aunque ligeramente diferente ... No necesitaba un valor de retorno diferente en función de los argumentos, pero tuve que probar para asegurarme de que se pasaran 2 conjuntos de argumentos a la misma función). Me topé con algo como esto:
No es perfecto, ya que requiere que se conozca el orden de las 2 llamadas a foo (), pero en la práctica esto probablemente no sea tan malo.
fuente
Probablemente desee hacer una devolución de llamada de una manera OOP:
fuente
No es exactamente lo que pides, pero en algunos casos puede ayudar:
onConsecutionCalls : devuelve una lista de valores en el orden especificado
fuente
Pase una matriz de dos niveles, donde cada elemento es una matriz de:
ejemplo:
fuente
También puede devolver el argumento de la siguiente manera:
Como puede ver en la documentación de Mocking , el método
returnValue($index)
permite devolver el argumento dado.fuente
¿Te refieres a algo como esto?
fuente
Tuve un problema similar que no pude resolver también (hay sorprendentemente poca información sobre PHPUnit). En mi caso, acabo de hacer cada prueba por separado: entrada conocida y salida conocida. Me di cuenta de que no necesitaba hacer un objeto simulado de Jack-of-All-Trades, solo necesitaba uno específico para una prueba específica, y por lo tanto separé las pruebas y puedo probar aspectos individuales de mi código como un separado unidad. No estoy seguro de si esto podría ser aplicable a usted o no, pero eso depende de lo que necesite probar.
fuente
fuente
Tratar :
fuente