PHPUnit: pruebas para los casos que no son manejados por la función base -- php campo con phpunit camp Relacionados El problema

PHPUnit - Testing for cases that are not handled by the base function


0
vote

problema

Español

Tengo una consulta sobre phpunit. ¿Cómo creo un caso de prueba en phpunit para los casos que no se manejan en la clase base en sí? Por ejemplo, considere el siguiente método de ShowMessage.

  Class Message {      public function showMessage($type = 1)     {          if(1 == $type){             return 'Success';         }elseif(2 == $type){             return 'ERROR';         }      }  }   

En el método de ShowMessage mencionado anteriormente, también debe haber un caso que si el $type es otra cosa que 1 o 2, por lo que debe tener un caso, por lo que las condiciones deben ser algo así como < / p>

      if(1 == $type){         return 'Success';     }elseif(2 == $type){         return 'ERROR';     }else{         return 'UNKNOWN';     }   

Gracias por cualquier entrada

Original en ingles

I have a query about PHPUnit. How do I create a test case in PHPUnit for cases that are NOT handled in the base class itself. For example, Please Consider the following showMessage method.

Class Message {      public function showMessage($type = 1)     {          if(1 == $type){             return 'Success';         }elseif(2 == $type){             return 'ERROR';         }      }  } 

In the showMessage method above, there should also be a case that if the $type is anything other than 1 or 2, so it should have a else case, so the conditions should be something like

    if(1 == $type){         return 'Success';     }elseif(2 == $type){         return 'ERROR';     }else{         return 'UNKNOWN';     } 

Thanks for any inputs

     

Lista de respuestas

1
 
vote

No estoy realmente seguro de lo que estás preguntando, pero le daré un tiro ...

Para probar el método showMessage en su primer bloque de código, usted haría algo como esto, ya que las funciones devolverán null cuando no return2 es especificado o solo un return; es.

  public function testShowMessage() {     $msg = new Message();      $this->assertEquals('Success', $msg->showMessage(1));     $this->assertEquals('ERROR', $msg->showMessage(2));     $this->assertEquals(null, $msg->showMessage(-1));     $this->assertEquals(null, $msg->showMessage(3));     $this->assertEquals(null, $msg->showMessage('test')); }   

El caso de prueba para su segundo método sería:

  public function testShowMessage() {     $msg = new Message();      $this->assertEquals('Success', $msg->showMessage(1));     $this->assertEquals('ERROR', $msg->showMessage(2));     $this->assertEquals('UNKNOWN', $msg->showMessage(-1));     $this->assertEquals('UNKNOWN', $msg->showMessage(3));     $this->assertEquals('UNKNOWN', $msg->showMessage('test')); }   

La forma en que se escribe el método showMessage6 , debe lanzar una excepción si no se pasa un 9988777667 o un 9988777668 como TI Impulse un mejor diseño, en lugar de simplemente intentar pasar cualquier valor antiguo al método. Refactore este método a algo como esto:

  /**  * @param int $type  * @return string  * @throws InvalidArgumentException  */ public function showMessage($type) {     // Will be cast to 0 if it cannot be converted. 0 is not used in this method.     switch ((int) $type) {         case 1:             return 'Success';         case 2:             return 'ERROR';         default:             throw new InvalidArgumentException("$type requires an integer value of 1 or 2.");     }  }   

Aunque no me gustaría diseñar este tipo de método en primer lugar, está haciendo lo mejor de esta situación. Aquí están los casos de prueba relevantes:

  null0  

En su método original, especifique null1 como un parámetro opcional, parece que está agregando todo este código de evitación para distanciarse de cualquier método / datos que se llame / pase al null2 MÉTODO. Otro ejemplo de esto está devolviendo null3 . Debe haber cheques antes de esta o una excepción para que pueda ser atrapado fácilmente mientras pruebe. Esto podría introducir errores en una fecha posterior.

espero que elimine las cosas.

 

Not really sure what you are asking but I'll give it a shot..

To test the showMessage method in your first code block you would do something like this as functions will return null when either no return is specified or just a return; is.

public function testShowMessage() {     $msg = new Message();      $this->assertEquals('Success', $msg->showMessage(1));     $this->assertEquals('ERROR', $msg->showMessage(2));     $this->assertEquals(null, $msg->showMessage(-1));     $this->assertEquals(null, $msg->showMessage(3));     $this->assertEquals(null, $msg->showMessage('test')); } 

The test case for your second method would be:

public function testShowMessage() {     $msg = new Message();      $this->assertEquals('Success', $msg->showMessage(1));     $this->assertEquals('ERROR', $msg->showMessage(2));     $this->assertEquals('UNKNOWN', $msg->showMessage(-1));     $this->assertEquals('UNKNOWN', $msg->showMessage(3));     $this->assertEquals('UNKNOWN', $msg->showMessage('test')); } 

The way the showMessage method is wrote in my opinion should throw an exception if it is not passed a 0 or a 1 as it enforces better design, instead of just trying to pass any old value to the method. I would refactor this method to something such as this:

/**  * @param int $type  * @return string  * @throws InvalidArgumentException  */ public function showMessage($type) {     // Will be cast to 0 if it cannot be converted. 0 is not used in this method.     switch ((int) $type) {         case 1:             return 'Success';         case 2:             return 'ERROR';         default:             throw new InvalidArgumentException("\$type requires an integer value of 1 or 2.");     }  } 

Although I wouldn't of designed this sort of method in the first place, it is making the best of this situation. Here are the relevant test cases:

public function testShowMessage() {     $msg = new Message();      $this->assertEquals('Success', $msg->showMessage(1));     $this->assertEquals('ERROR', $msg->showMessage(2)); }  /**  * @expectedException InvalidArgumentException  */ public function testShowMessageExceptionWithInteger() {     $msg = new Message();     $msg->showMessage(0); }  /**  * @expectedException InvalidArgumentException  */ public function testShowMessageExceptionWithString() {     $msg = new Message();     $msg->showMessage("test"); } 

In your original method you specify $type as an optional parameter, it seems that you are adding all this avoidance code to distance yourself away from any method/data that is calls/passed to the showMessage() method. Another example of this is returning UNKNOWN. There should be checks before this or an exception so it can be caught easily whilst testing. This could introduce bugs at a later date.

Hope that clears things up.

 
 
         
         

Relacionados problema

1  phpunit dbunit @dataprovider no funciona  ( Phpunit dbunit dataprovider doesnt work ) 
Pasé mucho tiempo buscando dónde está el problema, pero no he encontrado nada. it sais "testadd causó un error: faltante argumento". Simplemente el DataProv...

10  Cobertura de código de agregación de diferentes marcos de prueba  ( Aggregating code coverage from different testing frameworks ) 
En el flujo de trabajo de programación moderno, se utilizan numerosos marcos de prueba a la vez. Por ejemplo, en PHP World, es una forma estándar de facto de ...

6  PHPUnit Falló el archivo requerido  ( Phpunit failed opening required file ) 
He navegado por problemas similares en adelante, pero en vano. Estoy ejecutando PHP 5.3.6 y PHPUnit versión 3.6.10. Al intentar ejecutar una prueba simple: ...

1  Zend Framework / phpunit: ¿Cómo Stub / Mofe un método de objeto que se conecta a una base de datos?  ( Zend framework phpunit how to stub mock an object method that connects to a dat ) 
En mi proyecto Marco Zend, tengo una forma que estoy probando. En mi forma, un elemento de selección múltiple obtiene sus opciones de un modelo, que las recup...

6  Relaciones de Fábrica de Laravel ... Respeto Crear () o Hacer ()  ( Laravel factory relationships respect create or make ) 
Según Laravel's Documentación sobre la definición de las relaciones dentro de las fábricas del modelo : También puede adjuntar relaciones con los modelos ...

7  Formulario de Zend: ¿Cómo pasar parámetros al constructor?  ( Zend form how to pass parameters into the constructor ) 
Estoy tratando de probar mi forma. Se construirá otros objetos, así que necesito una manera de burlarse de ellos. Intenté pasarlos al constructor ... class...

0  Cómo evitar que el módulo se cargue en Zend Framework 2 PHPUNIT PRUEBA  ( How to prevent module from being loaded in zend framework 2 phpunit test ) 
Escribí una aplicación ZF2 con un módulo de autenticación. La configuración de este módulo de autenticación se realiza en su archivo Module.php. Configuré u...

0  Phpunit Reporting "Aborted" sin importar las pruebas que se ejecuten  ( Phpunit reporting aborted no matter what tests are run ) 
Tener un problema raro con phpunit. Estamos usando phpunit como parte de un entorno de integración continua, que contiene una aplicación escrita usando Zend F...

2  ¿Cómo enviar la URL con subdominio en la prueba del controlador Zend Phpunit?  ( How to dispatch url with subdomain in zend phpunit controller test ) 
Quiero probar mi controlador que funciona en el subdominio www.username.domain.com El problema es cuando envío en el controlesto de control, tira zend_contr...

1  ¿Cómo conectar la base de datos de pruebas en las pruebas funcionales?  ( How to connect test database in functional testing ) 
Estudio una prueba funcional en Symfony y fue realmente exitoso trabajando en él, pero tengo problemas en la base de datos. En mi sistema, tengo 2 base de dat...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos