phpunit自定义声明需要帮助


phpunit custom asserts help needed

根据本教程,我正在尝试向phpunit添加一个自定义断言,以验证作为字符串返回的复数(例如

"-123+456i"

通过我正在测试的方法)达到实数和虚数分量的定义精度。我放入了一个Complex.php类来将字符串解析为实部和虚部,并将以下断言类组合为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);
        }
    }
}

我的单元测试脚本:

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

当我只是在做assertEquals。。。但现在我添加了include并更改为新的assert,它崩溃了,声称它不能调用未定义的方法assertComplexEquals()。

有没有人成功地用自定义断言扩展了phpunit,并且可以看出我做错了什么?

显然,让$this->someCustomAssertion工作的唯一方法是扩展PHPUnit_Framework_TestCase并在那里创建包装器方法,或者静态地调用自定义断言。

例如,Zend Framework只是用额外的方法(断言)

扩展了PHPUnit_Framework_TestCase

最后,我选择不扩展现有的断言,而是修改复杂的断言逻辑,以返回一个简单的布尔值,然后可以使用assertTrue()进行测试,并带有一条错误消息,可以使用简单的getMessage()检索该消息,以显示在phpunit结果中。老实说,用这种方式感觉容易多了

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

我的单元测试脚本:

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

并且记录的phpunit结果足够清楚:

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.