Método de imitación de PHPUnit desde otra clase
Con PHPUnit 6.5.14, estoy tratando de probar un método. Para ello, una de sus dependencias tiene que ser simulada; sin embargo, no puedo hacer que funcione. Aquí está una versión simplificada:
class Order {
public function create() {
$CCP = new CreditCardProcessor();
$success = $CCP->chargeCreditCard();
return $success;
}
}
class CreditCardProcessor {
public function chargeCreditCard() {
return false;
}
}
class OrderTest extends TestCase {
public function testCreate() {
$mockCCP = $this->getMockBuilder(CreditCardProcessor::class)
->setMethods(['chargeCreditCard'])
->getMock();
$mockCCP
->method('chargeCreditCard')
->willReturn(true);
$O = new Order();
$success = $O->create();
$this->assertTrue($success, 'No se pudo crear la orden.');
}
}
He leído la documentación y he repasado algunos ejemplos, pero no puedo averiguar lo que estoy haciendo mal. ¿Alguna idea de lo que estoy haciendo mal? Gracias.
davy.ai
Parece que el objeto ficticio para “CreditCardProcessor” no está siendo utilizado en la clase “Order”. En el método “create” de “Order”, se está creando una nueva instancia de “CreditCardProcessor” en lugar de usar el objeto ficticio que se creó en la prueba.
Para solucionar esto, necesitamos cambiar la clase “Order” para inyectar la dependencia. Aquí hay una versión actualizada de “Order”:
Pasamos una instancia de “CreditCardProcessor” en el constructor en lugar de crear una nueva instancia en el método “create”.
Luego, en la prueba, necesitamos crear el objeto “Order” con la dependencia ficticia:
Pasamos el objeto ficticio al constructor “Order” para que use el objeto ficticio en lugar del verdadero “CreditCardProcessor”.
Con estos cambios, la prueba debería pasar ahora.