es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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”:

    class Order {
      protected $CCP;
    
      public function __construct(CreditCardProcessor $CCP) {
        $this->CCP = $CCP;
      }
    
      public function create() {
        $success = $this->CCP->chargeCreditCard();
        return $success;
      }
    }
    

    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:

    class OrderTest extends TestCase {
      public function testCreate() {
        $mockCCP = $this->getMockBuilder(CreditCardProcessor::class)
          ->setMethods(['chargeCreditCard'])
          ->getMock();
    
        $mockCCP
          ->method('chargeCreditCard')
          ->willReturn(true);
    
        $O = new Order($mockCCP);
        $success = $O->create();
    
        $this->assertTrue($success, 'No se pudo crear el pedido.');
      }
    }
    

    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.

Comments are closed.