¿Alguien sabe si hay un assert
o algo así que puede probar si se lanzó una excepción en el código que se está probando?PHPUnit afirman que se lanzó una excepción?
Respuesta
<?php
require_once 'PHPUnit/Framework.php';
class ExceptionTest extends PHPUnit_Framework_TestCase
{
public function testException()
{
$this->expectException(InvalidArgumentException::class);
// or for PHPUnit < 5.2
// $this->setExpectedException(InvalidArgumentException::class);
//...and then add your test code that generates the exception
exampleMethod($anInvalidArgument);
}
}
expectException() PHPUnit documentation
PHPUnit author article proporciona explicaciones detalladas de probar las excepciones mejores prácticas.
+1 por no confiar en el doc-block mágico – SuperFamousGuy
Si usa espacios de nombres, debe ingresar el espacio de nombre completo: '$ this-> setExpectedException ('\ My \ Name \ Space \ MyExceptionException');' – Alcalyn
Tenga en cuenta que no parece haber una manera de esperar explícitamente ninguna excepción. Solo tiene que llamar a su método y, si se lanza una excepción, la prueba fallará automáticamente. –
También se puede utilizar un docblock annotation:
class ExceptionTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException InvalidArgumentException
*/
public function testException()
{
...
}
}
Para PHP 5.5 o superior (en especial con código de espacio de nombres), ahora prefieren usar ::class
Código
IMO, este es el método preferido. –
@MikePurcell, ¿por qué? –
@ Prof.Falken: preferencia personal. La anotación de Docblock mantiene el método de prueba limpio, y varios frameworks están haciendo uso de la misma práctica; symfony 2, zf2. –
continuación mensaje de excepción y el código de excepción pondrá a prueba.
Importante: Fallará si no se lanza una excepción esperada.
try{
$test->methodWhichWillThrowException();//if this method not throw exception it must be fail too.
$this->fail("Expected exception 1162011 not thrown");
}catch(MySpecificException $e){ //Not catching a generic Exception or the fail function is also catched
$this->assertEquals(1162011, $e->getCode());
$this->assertEquals("Exception Message", $e->getMessage());
}
'$ this-> fail()' no está destinado a ser utilizado de esta manera, no creo, al menos no actualmente (PHPUnit 3.6.11); actúa como una excepción en sí misma. Usando su ejemplo, si '$ this-> fail (se llama" excepción esperada no lanzada ")', se activa el bloque 'catch' y' $ e-> getMessage() 'es _" excepción esperada no lanzada "_ . – ken
@ken probablemente tengas razón. La llamada a 'fail' probablemente pertenece * después de * el bloque catch, no dentro del try. –
Tengo que rechazarlo porque la llamada a 'fail' no debería estar en el bloque' try'. En sí mismo desencadena el bloqueo 'catch' produciendo resultados falsos. – Twifty
Puede utilizar assertException extension hacer valer más de una excepción durante una ejecución de prueba.
método Insert en su TestCase y uso:
public function testSomething()
{
$test = function() {
// some code that has to throw an exception
};
$this->assertException($test, 'InvalidArgumentException', 100, 'expected message');
}
También hizo una trait para los amantes del código de buen ..
¿Qué PHPUnit estás usando? Estoy usando PHPUnit 4.7.5, y allí 'assertException' no está definido. Tampoco puedo encontrarlo en el manual de PHPUnit. – physicalattraction
El método 'asertException' no es parte de PHPUnit original. Debe heredar la clase 'PHPUnit_Framework_TestCase' y agregar [método vinculado en la publicación anterior] (https://gist.github.com/VladaHejda/8826707) manualmente. Sus casos de prueba heredarán esta clase heredada. – hejdav
public function testException() {
try {
$this->methodThatThrowsException();
$this->fail("Expected Exception has not been raised.");
} catch (Exception $ex) {
$this->assertEquals($ex->getMessage(), "Exception message");
}
}
Si se está ejecutando en PHP 5.5 o superior, puede usar ::class
resolution para obtener el nombre de la clase con expectException
/setExpectedException
. Esto proporciona varios beneficios:
- El nombre será totalmente calificado con su espacio de nombres (si corresponde).
- Se resuelve en
string
por lo que funcionará con cualquier versión de PHPUnit. - Obtiene la finalización del código en su IDE.
- El compilador de PHP emitirá un error si escribe mal el nombre de la clase.
Ejemplo:
namespace \My\Cool\Package;
class AuthTest extends \PHPUnit_Framework_TestCase
{
public function testLoginFailsForWrongPassword()
{
$this->expectException(WrongPasswordException::class);
Auth::login('Bob', 'wrong');
}
}
PHP compila
WrongPasswordException::class
en
"\My\Cool\Package\WrongPasswordException"
sin PHPUnit siendo el más prudente.
Nota: PHPUnit 5.2 introduced
expectException
como un reemplazo parasetExpectedException
.
/**
* @expectedException Exception
* @expectedExceptionMessage Amount has to be bigger then 0!
*/
public function testDepositNegative()
{
$this->account->deposit(-7);
}
Sé muy cuidadoso acerca "/**"
, observe el doble "*". Escribir solo "* *" (asterix) fallará su código. También asegúrese de usar la última versión de phpUnit. En algunas versiones anteriores de phpunit @expectedException, la excepción no es compatible. Tenía 4.0 y no funcionó, tuve que actualizar a 5.5 https://coderwall.com/p/mklvdw/install-phpunit-with-composer para actualizar con el compositor.
Una forma alternativa puede ser la siguientes aparatos:
$this->expectException(\Exception::class);
$this->expectExceptionMessage('Expected Exception Message');
Por favor asegúrese de que sus extensiones de clase Test \ PHPUnit_Framework_TestCase
He aquí todas las afirmaciones de excepción que puede hacer. Tenga en cuenta que todos ellos son opcionales.
class ExceptionTest extends PHPUnit_Framework_TestCase
{
public function testException()
{
// make your exception assertions
$this->expectException(InvalidArgumentException::class);
// if you use namespaces:
// $this->expectException('\Namespace\MyException');
$this->expectExceptionMessage('message');
$this->expectExceptionMessageRegExp('/essage$/');
$this->expectExceptionCode(123);
// code that throws an exception
throw new InvalidArgumentException('message', 123);
}
public function testAnotherException()
{
// repeat as needed
$this->expectException(Exception::class);
throw new Exception('Oh no!');
}
}
documentación se puede encontrar here.
El método PHPUnit expectException
es muy inconveniente porque permite probar solo una excepción por método de prueba.
He hecho esta función auxiliar para afirmar que alguna función lanza una excepción:
/**
* Asserts that the given callback throws the given exception.
*
* @param string $expectClass The name of the expected exception class
* @param callable $callback A callback which should throw the exception
*/
protected function assertException(string $expectClass, callable $callback)
{
try {
$callback();
} catch (\Throwable $exception) {
$this->assertInstanceOf($expectClass, $exception);
return;
}
$this->fail('No exception was thrown');
}
añadirlo a su clase de prueba y la llamada de esta forma:
public function testSomething() {
$this->assertException(\PDOException::class, function() {
new \PDO('bad:param');
});
$this->assertException(\PDOException::class, function() {
new \PDO('foo:bar');
});
}
- 1. ¿Cómo hacer que el código se ejecute solo si se lanzó una excepción?
- 2. Caras Servlet lanzó la excepción java.lang.StackOverflowError
- 3. ¿Detecta que una aplicación se lanzó al estado de fondo?
- 4. El inicializador de tipo para 'NHibernate.LoggerProvider' lanzó una excepción
- 5. ¿Cómo puedo saber si se lanzó una excepción SQL debido a una violación de clave externa?
- 6. ¿Hay alguna forma de obtener el número de línea donde se lanzó una excepción?
- 7. afirman no contiene elemento
- 8. Microsoft.Build.Utilities.FileTracker lanzó un error de excepción. Ocurre con diferentes proyectos
- 9. ¿Por qué Servlet.service() para servlet jsp lanzó esta excepción?
- 10. phpunit throws Excepción no detectada 'PHPUnit_Framework_Exception
- 11. ¿Encuentra dónde se lanzó originalmente la excepción retroprown utilizando el depurador Visual Studio C#?
- 12. ¿Cómo se indica que se espera que falle una prueba PHPUnit?
- 13. PHPUnit se burla de una amplia documentación
- 14. Cómo depurar "El inicializador de tipo para 'mi clase' lanzó una excepción"
- 15. Error de plantillas WPF: "Proporcionar valor en 'System.Windows.Baml2006.TypeConverterMarkupExtension' lanzó una excepción."
- 16. VS2010 agregar nuevos archivos throws Establecer propiedad 'System.Windows.ResourceDictionary.DeferrableContent' lanzó una excepción
- 17. No se puede cargar el complemento de Exchange powershell: el inicializador de tipo para 'Microsoft.Exchange.Data.Directory.Globals' lanzó una excepción
- 18. ¿Cómo se usa PHPUnit para probar una función si se supone que esa función matará a PHP?
- 19. Manejo de una excepción de Python que se produce dentro de una cláusula de excepción
- 20. ¿Cómo escribir una aserción PHPUnit personalizada que se comporte como una aserción incorporada?
- 21. PHPUnit: ¿Cómo afirmar que una clase amplía otra clase?
- 22. ramita Symfony2 representación, excepción que se
- 23. Haciendo que PHPUnit ignore las cosas?
- 24. salida PHPUnit que causan excepciones Zend_Session
- 25. Con PHPUnit Class 'mysqli' no se encuentra
- 26. PHPUnit: espera que el método signifique
- 27. No puedo conseguir que PHPunit funcione
- 28. Selenium, PHPUnit y AttachFile()
- 29. El parámetro phpunit memory_limit no se aplica
- 30. PHPUnit - Errores
Para esas respuestas: ¿qué pasa multi-aseveraciones en una función de prueba, y solo espero tener una excepción de tiro? ¿TENGO que separarlos y poner el uno en una función de prueba independiente? –