phpunit custom заявляет, что нужна помощь - PullRequest
6 голосов
/ 23 января 2012

Я пытаюсь добавить пользовательское утверждение в 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 с помощью пользовательских утверждений и может понять, что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 23 января 2012

Очевидно, что единственный способ заставить $this->someCustomAssertion работать - это расширить PHPUnit_Framework_TestCase и создать там методы-оболочки, или статически вызывать ваши пользовательские утверждения.

Например, Zend Framework просто расширяет PHPUnit_Framework_TestCaseс дополнительными методами (утверждениями)

0 голосов
/ 31 января 2012

В итоге я решил не расширять существующие утверждения, а изменить свою сложную логику утверждений так, чтобы она возвращала простое логическое значение, которое затем можно было проверить с помощью 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.
...