phpunit 自定义断言需要帮助
我正在尝试按照本教程向 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...但现在我添加了包含并更改为我的新断言,它崩溃了,声称它无法调用未定义的方法assertComplexEquals()。
有没有人成功地使用自定义断言扩展 phpunit,并且可以看到我做错了什么?
I'm trying to add a custom assert to phpunit, following this tutorial, to validate complex numbers returned as a string (e.g.
"-123+456i"
by the method that I'm testing) to a defined precision for both the real and imaginary components. I've put a Complex.php class to parse the string into the real and imaginary parts, and put together the following assertion class as 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);
}
}
}
My unit test script:
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');
}
}
The unit tests worked without error (but failed) when I was simply doing an assertEquals... but now I've added the include and changed to my new assert, it's crashing claiming that it can't call the undefined method assertComplexEquals().
Has anybody had any success extending phpunit with custom asserts, and can see what I'm doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
显然,让
$this->someCustomAssertion
工作的唯一方法是扩展PHPUnit_Framework_TestCase
并在那里创建包装方法,或者静态调用自定义断言。例如,Zend Framework 只是使用附加方法(断言)扩展
PHPUnit_Framework_TestCase
Obviously the only way to get
$this->someCustomAssertion
worked is to extendPHPUnit_Framework_TestCase
and create wrapper-methods there, or call your custom assertions statically.Zend Framework, for example, just extends
PHPUnit_Framework_TestCase
with additional methods (assertions)最后,我选择不扩展现有的断言,而是修改复杂的断言逻辑以返回一个简单的布尔值,然后可以使用assertTrue()对其进行测试,并使用可以使用简单的getMessage()检索的错误消息用于在 phpunit 结果中显示。说实话,用这种方式感觉容易多了
我的单元测试脚本:
并且记录的 phpunit 结果足够清晰:
In the end, I chose not to extend existing asserts, but to modify my complex assertion logic to return a simple boolean, that could then be tested using assertTrue(), and with an error message that could be retrieved with a simple getMessage() for display in the phpunit results. To be honest, it feels a whole lot easier to use this way
My unit test script:
and the logged phpunit result is clear enough: