编写自定义断言
最后更新于:2022-04-01 03:46:49
# 编写自定义断言
编写自定义断言时,最佳实践是遵循 PHPUnit 自有断言的实现方式。正如 [Example 14.1, “PHPUnit_Framework_Assert 类的 assertTrue() 与 isTrue() 方法”](# "Example 14.1. PHPUnit_Framework_Assert 类的 assertTrue() 与 isTrue() 方法")中所示,`assertTrue()` 方法只是对 `isTrue()` 和 `assertThat()` 方法的外包覆:`isTrue()` 创建了一个匹配器对象,将其传递给 `assertThat()` 进行评定。
**Example 14.1. PHPUnit_Framework_Assert 类的 assertTrue() 与 isTrue() 方法**
~~~
<?php
abstract class PHPUnit_Framework_Assert
{
// ...
/**
* 断言某个条件为真。
*
* @param boolean $condition
* @param string $message
* @throws PHPUnit_Framework_AssertionFailedError
*/
public static function assertTrue($condition, $message = '')
{
self::assertThat($condition, self::isTrue(), $message);
}
// ...
/**
* 返回一个 PHPUnit_Framework_Constraint_IsTrue 匹配器对象
*
* @return PHPUnit_Framework_Constraint_IsTrue
* @since Method available since Release 3.3.0
*/
public static function isTrue()
{
return new PHPUnit_Framework_Constraint_IsTrue;
}
// ...
}?>
~~~
[Example 14.2, “PHPUnit_Framework_Constraint_IsTrue 类”](# "Example 14.2. PHPUnit_Framework_Constraint_IsTrue 类")展示了 `PHPUnit_Framework_Constraint_IsTrue` 是如何扩展针对匹配器对象(或约束)的抽象基类 `PHPUnit_Framework_Constraint` 的。
**Example 14.2. PHPUnit_Framework_Constraint_IsTrue 类**
~~~
<?php
class PHPUnit_Framework_Constraint_IsTrue extends PHPUnit_Framework_Constraint
{
/**
* 对参数 $other 进行约束评定。如果符合约束,
* 返回 TRUE,否则返回 FALSE。
*
* @param mixed $other Value or object to evaluate.
* @return bool
*/
public function matches($other)
{
return $other === TRUE;
}
/**
* 返回代表此约束的字符串。
*
* @return string
*/
public function toString()
{
return 'is true';
}
}?>
~~~
在实现 `assertTrue()` 和 `isTrue()` 方法及 `PHPUnit_Framework_Constraint_IsTrue` 类时所付出的努力带来了一些好处,`assertThat()` 能够自动负责起断言的评定与任务簿记(例如为了统计目的而对其进行计数)工作。此外, `isTrue()` 方法还可以在配置仿件对象时用来作为匹配器。