2012-01-23 13 views
6

Ben karmaşık sayılar bir dizge olarak döndürülür doğrulamak için, this tutorial sonrasında PHPUnit için özel assert eklemek çalışıyorum gerekli iddia (örnPHPUnit Özel yardım

"-123 + 456i"

, test ettiğim yöntemle) hem gerçek hem de sanal bileşenler için tanımlı bir kesinliğe.

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

    } 
} 

Benim birim test komut:

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'); 
    } 
} 
Ben gerçek ve hayali bölüme dizeyi ayrıştırmak ve complexAssert.php olarak aşağıdaki onaylama işlemi sınıfını herkesi bir araya getirdi Complex.php sınıfını koyduk

Birim testler hatasız çalıştı (ancak başarısız oldu), sadece bir assertEquals yapıyordum ... ama şimdi ekledim ve yeni assert olarak değiştirdim, unertfined method assertComplexEquals'ı çağıramayacağını iddia ederek çöküyor.).

Herhangi bir kişi, phpunit'i özel önerilerle genişletmeyi başarabilmiş ve ne yaptığımı görebiliyor mu?

+0

Yapabilirsin daha iyi resmi http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.custom-assertions – zerkms

+2

Bu sorunun ilgisiz olmasına rağmen, '__DIR__' kullanmak isteyebilirsiniz (PHP 5.3 +) veya 'dirname (__ FILE __)' yerine de Program çalışırken değişebilen mevcut çalışma dizini beklemede. –

+0

@David Harkness: Bahse girerim bu durumda getcwd()! = __DIR__' – zerkms

cevap

0

ile

Zend Framework, örneğin, sadece uzanır PHPUnit_Framework_TestCase, ben iddia mevcut uzatmak için, ama basit bir mantıksal dönmek benim karmaşık iddia mantığı o olabilir değiştirmek tercih etti daha sonra assertTrue() kullanarak ve phpunit sonuçlarında görüntülemek için basit bir getMessage() ile alınabilecek bir hata mesajıyla test edilmelidir. Dürüst olmak gerekirse, bunu şu şekilde kullanmak çok daha kolay hissediyor

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

Benim birim test komut:

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

ve kaydedilir PHPUnit sonucu yeterince açık:

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

Açıkçası, $this->someCustomAssertion ürününü kullanmanın tek yolu, PHPUnit_Framework_TestCase ürününü genişletmek ve sarıcı yöntemleri burada oluşturmak veya özel olarak belirttiğiniz ifadeleri statik olarak çağırmaktır. Ek yöntemlerle (iddialar) Sonunda