Sto cercando di aggiungere un assert personalizzato per PHPUnit, dopo this tutorial, per convalidare i numeri complessi restituiti sotto forma di stringa (ad esempiophpunit personalizzato afferma aiuto necessario
"-123 + 456i"
dal metodo che sto testando) con una precisione definita per entrambi i componenti reali e immaginari. Ho messo una classe Complex.php per analizzare la stringa nelle parti reale e immaginaria, e mettere insieme la seguente classe asserzione come 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);
}
}
}
Il mio script di test di unità:
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');
}
}
I test delle unità hanno funzionato senza errori (ma non sono riusciti) quando stavo semplicemente facendo un assertEquals ... ma ora ho aggiunto l'inclusione e ho cambiato il mio nuovo assert, si blocca affermando che non può chiamare il metodo indefinito assertComplexEquals ().
Qualcuno ha avuto successo estendendo la phpunit con asserzioni personalizzate e può vedere cosa sto facendo male?
Si potrebbe meglio seguire il http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.custom-assertions – zerkms
, benché non correlato a questo problema, si potrebbe voler usare '__DIR__' (PHP 5.3 +) o 'dirname (__ FILE __)' piuttosto che de in attesa sulla directory di lavoro corrente che può cambiare durante l'esecuzione del programma. –
@David Harkness: Scommetto che nel suo caso 'getcwd()! = __DIR__' – zerkms