Phpunit custom claims help needed

I am trying to add a custom assert to phpunit following this tutorial to check for complex numbers returned as a string (e.g.

"- 123 + 456i"

the method I'm testing) to a certain accuracy for both the real and imaginary components. I placed the Complex.php class to parse the string into the real and imaginary parts and compiled the following statement class as complexAssert.php:

require_once 'PHPUnit/Framework/Assert.php'; include_once getcwd().'/custom/Complex.php'; class complexAssert extends PHPUnit_Framework_Assert { public function assertComplexEquals($expected, $actual, $message = '', $delta = 0) { $expectedComplex = new Complex($expected); $actualComplex = new Complex($actual); if (!($actualComplex->getReal() >= ($expectedComplex - $delta) && $actualComplex->getReal() <= ($expectedComplex + $delta))) { return $this->fail($message); } if (!($actualComplex->getImaginary() >= ($expectedComplex - $delta) && $actualComplex->getImaginary() <= ($expectedComplex + $delta))) { return $this->fail($message); } } } 

My unit test script:

 require_once getcwd().'/custom/complexAssert.php'; require_once 'testDataFileIterator.php'; class EngineeringTest extends PHPUnit_Framework_TestCase { /** * @dataProvider providerIMSUM */ public function testIMSUM() { $args = func_get_args(); $expectedResult = array_pop($args); $result = call_user_func_array(array('PHPExcel_Calculation_Engineering','IMSUM'),$args); $this->assertComplexEquals($expectedResult, $result); } public function providerIMSUM() { return new testDataFileIterator('rawTestData/Calculation/Engineering/IMSUM.data'); } } 

The unit tests worked without errors (but failed) when I just did assertEquals ... but now I added include and changed it to a new assert, it crashes, claiming that it cannot call the undefined assertComplexEquals () method.

Has anyone been successful in extending phpunit with custom statements and can see what I'm doing wrong?

+6
source share
2 answers

In the end, I decided not to redistribute existing statements, but to modify my complex statement logic to return a simple boolean value that can then be checked with assertTrue () and with an error message that can be obtained with simple getMessage () to display in phpunit results. Honestly, it is much easier to use.

 include_once __DIR__.'/Complex.php'; class complexAssert { private $_errorMessage = ''; public function assertComplexEquals($expected, $actual, $delta = 0) { $expectedComplex = new Complex($expected); $actualComplex = new Complex($actual); if ($actualComplex->getReal() < ($expectedComplex->getReal() - $delta) || $actualComplex->getReal() > ($expectedComplex->getReal() + $delta)) { $this->_errorMessage = 'Mismatched Real part: ' . $actualComplex->getReal() . ' !== ' . $expectedComplex->getReal(); return FALSE; } if ($actualComplex->getImaginary() < ($expectedComplex->getImaginary() - $delta) || $actualComplex->getImaginary() > ($expectedComplex->getImaginary() + $delta)) { $this->_errorMessage = 'Mismatched Imaginary part: ' . $actualComplex->getImaginary() . ' !== ' . $expectedComplex->getImaginary(); return FALSE; } return TRUE; } public function getErrorMessage() { return $this->_errorMessage; } } 

My unit test script:

 // Custom assertion class for handling precision of Complex numbers require_once __DIR__.'/../../custom/complexAssert.php'; // Data Provider handler require_once 'testDataFileIterator.php'; class EngineeringTest extends PHPUnit_Framework_TestCase { /** * @dataProvider providerIMSUM */ public function testIMSUM() { $args = func_get_args(); $expectedResult = array_pop($args); $result = call_user_func_array(array('PHPExcel_Calculation_Engineering','IMSUM'),$args); $complexAssert = new complexAssert(); $this->assertTrue($complexAssert->assertComplexEquals($expectedResult, $result, 1E-8), $complexAssert->getErrorMessage()); } public function providerIMSUM() { return new testDataFileIterator('rawTestData/Calculation/Engineering/IMSUM.data'); } } 

and the recorded phpunit result is pretty clear:

 3) EngineeringTest::testIMSUB with data set #7 ('-12.34-5.67i', '-123.45-67.89', '#NUM!') Mismatched String: 111.11 !== #NUM! Failed asserting that false is true. 
0
source

Obviously, the only way to get $this->someCustomAssertion is to extend PHPUnit_Framework_TestCase and create wrapper methods there or statically put your user statements.

Zend Framework, for example, simply extends PHPUnit_Framework_TestCase with additional methods (statements)

+1
source

Source: https://habr.com/ru/post/906614/


All Articles