Mar*_*ker 6 php phpunit assert
我正在尝试在本教程之后向phpunit添加一个自定义断言,以验证作为字符串返回的复数(例如
"-123 + 456 1"
通过我正在测试的方法,对于实部和虚部都定义了精度.我已经将一个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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的单元测试脚本:
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');
}
}
Run Code Online (Sandbox Code Playgroud)
当我只是做一个assertEquals时,单元测试没有错误(但失败了)...但是现在我已经添加了include并更改为我的新断言,它崩溃声称它无法调用未定义的方法assertComplexEquals() .
有没有人有任何成功扩展phpunit与自定义断言,并可以看到我做错了什么?
最后,我选择不扩展现有断言,而是修改复杂的断言逻辑以返回一个简单的布尔值,然后可以使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的单元测试脚本:
// 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');
}
}
Run Code Online (Sandbox Code Playgroud)
记录的 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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1734 次 |
| 最近记录: |