I'm not getting how to unit test Exceptions with PHPUnit.
Please see my method with the Exception:
public function getPhone($html, $tag = 'OFF', $indicative, $number_lenght) {
// .. code
if ($tag <> 'OFF') {
$html = $doc[$tag]->text(); // Apanho apenas o texto dentro da TAG
if (empty($html)) {
throw new Exception("Nao foi possivel apanhar qualquer texto dentro da TAG, Metodo em causa: getPhone()");
}
}
// .. code
}
And now my PHPUnit Test:
<?php
require_once '../Scrap.php';
class ScrapTest extends PHPUnit_Framework_TestCase
{
protected $scrap;
// Setup function to instantiate de object to $this->scrap
protected function setUp()
{
$this->scrap = new Scrap;
}
/**
* @covers Scrap::getPhone
* @expectedException Exception
*
*/
public function testGetPhone() {
// Variables1
$array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678);
$phone_list1 = '</div>A Front para<br /><br /><br /><br /><br /><br />-Apoio;<br />-Criação;<br />-Campanhas;<br />-Promoções<br /><br /><br />CONDIÇÕES:<br /><br />Local de Trabalho: Es<br />Folgas: Mistas<br /><br /><br /><br />ordem 500€<br /><br /><br /><br />Mínimos:<br /><br />- Conhecimentos;<br />- Ensino ;<br />-INGLÊS.<br /><br /><br /><br />Candidaturas: <br />[email protected]<br />218559372 | 927 555 929 | <br />RH<br />Rua C. Sal. 40<br />1000-000 Lisboa<br /><br /><br />+351 21 3456789 | (351) 912345678';
// Variables2
$array_static2 = Array(0 => 'NA');
$phone_list2 = "";
// .. more tests
// Test Exception, Tag not found
if (TRUE) {
// Bloco try/catch para confirmar que aqui lança excepção
try {
$this->scrap->getPhone($phone_list1, 'hr', '351', '9');
}
catch (Exception $expected) {
return;
}
$this->fail('An expected exception has not been raised.');
}
}
}
?>
If I run the test I got "Failure":
1) ScrapTest::testGetPhone
Expected exception Exception
FAILURES!
Tests: 1, Assertions: 5, Failures: 1.
The exception raises but I don't want to get failure in the PHPUnit, If the Exception raise, I want to get the test OK.
Can you give me some clues?
Best Regards,
Use expectExceptionMessage if the message is important, or if it is the only way to see where something went wrong. Use try catch if you need to validate specific properties of the exception. For this post, PHPUnit 9.5 and PHP 8.0 were used. If you want to run the tests for yourself, you can find them on github.
PHPUnit provides methods that are used to automatically create objects that will replace the original object in our test. createMock($type) and getMockBuilder($type) methods are used to create mock object. The createMock method immediately returns a mock object of the specified type.
The assertEquals() function is a builtin function in PHPUnit and is used to assert whether the actual obtained value is equals to expected value or not. This assertion will return true in the case if the expected value is the same as the actual value else returns false.
You are doing too much there.
Either use: @expectedException Exception
OR: try / catch / $this->fail
The way you are doing it right now says "catch that exception and THEN expect the code to throw another one!"
The first way is cleaner in my opinion because it's only 1 line against 5 (or even more) lines of code and it's less error prone.
/**
* @covers Scrap::getPhone
* @expectedException Exception
*
*/
public function testGetPhone() {
// Variables1
$array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678);
$phone_list1 = '...';
// Variables2
$array_static2 = Array(0 => 'NA');
$phone_list2 = "";
// .. more tests
// Bloco try/catch para confirmar que aqui lança excepção
$this->scrap->getPhone($phone_list1, 'hr', '351', '9');
That should do it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With