2012-01-23 9 views
6

Próbuję dodać niestandardowy dochodzić phpunit po this tutorial, aby potwierdzić liczbami zespolonymi zwracane jako ciąg znaków (npphpunit zwyczaj twierdzi potrzebna pomoc

„-123 + 456i”

według metody, którą testuję) do określonej precyzji zarówno dla komponentów rzeczywistych, jak i urojonych. Włożyłam klasę Complex.php do analizowania ciąg do rzeczywistych i urojonych części i złożyć następujące klasy Twierdzenie 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); 
     } 

    } 
} 

Mój skrypt testów jednostkowych:

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'); 
    } 
} 

Testy jednostkowe działały bezbłędnie (ale nie powiodło się), gdy po prostu wykonywałem assertEquals ... ale teraz dodałem opcję include i zmieniono ją na moje nowe twierdzenie, to się zawiesza, twierdząc, że nie może wywołać niezdefiniowanej metody assertComplexEquals ().

Czy ktokolwiek osiągnął sukces rozszerzając phpunit o niestandardowe twierdzenia i może zobaczyć, co robię źle?

+0

Mogłabyś lepiej śledzić oficjalne http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.custom-assertions – zerkms

+2

Niezwiązane z tym problemem, możesz użyć '__DIR__' (PHP 5.3 +) lub 'dirname (__ FILE __)' zamiast de oczekuje na bieżący katalog roboczy, który może ulec zmianie podczas działania programu. –

+0

@ David Harkness: Założę się, że w jego przypadku 'getcwd()! = __DIR__' – zerkms

Odpowiedz

0

W końcu wybrałem nie przedłużyć istniejący twierdzi jednak zmodyfikować moje złożonej logiki twierdzenie powrotu prostą logiczną, które mogłyby następnie przetestuj przy użyciu assertTrue() i komunikatu o błędzie, który można pobrać za pomocą prostego getMessage() do wyświetlenia w wynikach phpunit. Jeśli mam być szczery, to czuje się dużo łatwiejsze w użyciu w ten sposób

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; 
    } 
} 

Mój skrypt testów jednostkowych:

// 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'); 
    } 
} 

i zalogowanego wynik phpunit jest wystarczająco jasne:

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. 
1

Oczywiście jedynym sposobem na uzyskanie $this->someCustomAssertion jest rozszerzenie PHPUnit_Framework_TestCase i utworzenie tam metod pakowania lub statyczne wywoływanie własnych asercji.

Zend Framework, na przykład, tylko rozciąga PHPUnit_Framework_TestCase z dodatkowymi metodami (twierdzeń)