hamcrest / hamcrest-php
这是 Hamcrest 匹配器的 PHP 版本
Requires
- php: ^5.3|^7.0|^8.0
Requires (Dev)
- phpunit/php-file-iterator: ^1.4 || ^2.0
- phpunit/phpunit: ^4.8.36 || ^5.7 || ^6.5 || ^7.0
Replaces
- cordoval/hamcrest-php: *
- davedevelopment/hamcrest-php: *
- kodova/hamcrest-php: *
README
Hamcrest 是一个最初为 Java 编写的匹配库,但后来被移植到许多其他语言。hamcrest-php 是 Hamcrest 的官方 PHP 版本,本质上是对原始 Java API 的直接翻译,有一些例外,主要由于 PHP 语言障碍。
-
instanceOf($theClass)
实际上是anInstanceOf($theClass)
-
both(containsString('a'))->and(containsString('b'))
实际上是both(containsString('a'))->andAlso(containsString('b'))
-
either(containsString('a'))->or(containsString('b'))
实际上是either(containsString('a'))->orElse(containsString('b'))
-
除非匹配器这样做会失去语义,hamcrest-php 允许其输入动态类型,以“PHP方式”。例外的是,当类型本身的语义暗示了不同的情况时,例如 stringContains() 和 greaterThan()。
-
由于它们在 PHP 中没有意义或不适用,因此没有移植一些官方匹配器。
typeCompatibleWith($theClass)
eventFrom($source)
hasProperty($name)
**samePropertyValuesAs($obj)
**
-
当大多数集合匹配器最终被移植后,由于 Java 的 Arrays、Collections、Sets 和 Maps 与 PHP 的 Arrays 在命名约定上的差异,可能会创建特定的 PHP 别名。
** [除非我们认为 POPO(Plain Old PHP Objects)类似于 JavaBeans] - POPO 的事情是个玩笑。Java 开发者创造了 POJO(Plain Old Java Objects)这个术语。
用法
Hamcrest 匹配器很容易使用
Hamcrest_MatcherAssert::assertThat('a', Hamcrest_Matchers::equalToIgnoringCase('A'));
或者,您可以使用全局代理函数
$result = true; // with an identifier assertThat("result should be true", $result, equalTo(true)); // without an identifier assertThat($result, equalTo(true)); // evaluate a boolean expression assertThat($result === true); // with syntactic sugar is() assertThat(true, is(true));
⚠️ 注意:全局代理函数默认不会自动加载,因此您需要先加载它们
\Hamcrest\Util::registerGlobalFunctions();
为了简洁起见,以下所有示例都使用代理函数。
文档
在 Hamcrest 网站 上可以找到教程。
可用的匹配器
数组
anArray
- 评估数组
assertThat([], anArray());
hasItemInArray
- 检查项目是否存在于数组中
$list = range(2, 7, 2); $item = 4; assertThat($list, hasItemInArray($item));
-
hasValue
- hasItemInArray 的别名 -
arrayContainingInAnyOrder
- 检查数组是否包含元素,顺序无关紧要
assertThat([2, 4, 6], arrayContainingInAnyOrder([6, 4, 2])); assertThat([2, 4, 6], arrayContainingInAnyOrder([4, 2, 6]));
-
containsInAnyOrder
- arrayContainingInAnyOrder 的别名 -
arrayContaining
- 一个数组,其中的元素与给定的匹配器匹配,顺序相同。
assertThat([2, 4, 6], arrayContaining([2, 4, 6])); assertthat([2, 4, 6], not(arrayContaining([6, 4, 2])));
contains
- 检查数组是否按相同顺序包含
assertThat([2, 4, 6], contains([2, 4, 6]));
hasKeyInArray
- 检查数组是否具有给定的键
assertThat(['name'=> 'foobar'], hasKeyInArray('name'));
-
hasKey
- hasKeyInArray 的别名 -
hasKeyValuePair
- 检查数组是否具有给定的键值对
assertThat(['name'=> 'foobar'], hasKeyValuePair('name', 'foobar'));
-
hasEntry
- 与 hasKeyValuePair 相同 -
arrayWithSize
- 检查数组是否具有给定的大小
assertthat([2, 4, 6], arrayWithSize(3));
emptyArray
- 检查数组是否为空
assertThat([], emptyArray());
nonEmptyArray
assertThat([1], nonEmptyArray());
集合
emptyTraversable
- 检查可遍历是否为空
$empty_it = new EmptyIterator; assertThat($empty_it, emptyTraversable());
nonEmptyTraversable
- 检查可遍历是否不为空
$non_empty_it = new ArrayIterator(range(1, 10)); assertThat($non_empty_it, nonEmptyTraversable()); a
traversableWithSize
$non_empty_it = new ArrayIterator(range(1, 10)); assertThat($non_empty_it, traversableWithSize(count(range(1, 10)))); `
核心
allOf
- 只有当所有传入的匹配器都评估为真时才返回 true。
assertThat([2,4,6], allOf(hasValue(2), arrayWithSize(3)));
anyOf
- 如果任何传入的匹配器评估为真,则返回 true。
assertThat([2, 4, 6], anyOf(hasValue(8), hasValue(2)));
noneOf
- 如果任何传入的匹配器评估为真,则返回 false。
assertThat([2, 4, 6], noneOf(hasValue(1), hasValue(3)));
both
+andAlso
- 用于流畅地组合必须同时通过的匹配器。
assertThat([2, 4, 6], both(hasValue(2))->andAlso(hasValue(4)));
either
+orElse
- 用于流畅地组合匹配器,其中任何一个可以通过。
assertThat([2, 4, 6], either(hasValue(2))->orElse(hasValue(4)));
describedAs
- 包装现有的匹配器,并在失败时覆盖描述。
$expected = "Dog"; $found = null; // this assertion would result error message as Expected: is not null but: was null //assertThat("Expected {$expected}, got {$found}", $found, is(notNullValue())); // and this assertion would result error message as Expected: Dog but: was null //assertThat($found, describedAs($expected, notNullValue()));
everyItem
- 用于数组中每个元素的匹配器。
assertThat([2, 4, 6], everyItem(notNullValue()));
hasItem
- 检查数组是否包含给定项,可以接受一个匹配器参数
assertThat([2, 4, 6], hasItem(equalTo(2)));
hasItems
- 检查数组是否包含给定项,可以接受多个匹配器作为参数
assertThat([1, 3, 5], hasItems(equalTo(1), equalTo(3)));
对象
hasToString
- 检查__toString
或toString
方法
class Foo { public $name = null; public function __toString() { return "[Foo]Instance"; } } $foo = new Foo; assertThat($foo, hasToString(equalTo("[Foo]Instance")));
equalTo
- 使用比较运算符 '==' 比较两个实例
$foo = new Foo; $foo2 = new Foo; assertThat($foo, equalTo($foo2));
identicalTo
- 使用身份运算符 '===' 比较两个实例
assertThat($foo, is(not(identicalTo($foo2))));
anInstanceOf
- 检查实例是否为给定类的实例或子类
assertThat($foo, anInstanceOf(Foo::class));
-
any
-anInstanceOf
的别名 -
nullValue
检查 null
assertThat(null, is(nullValue()));
notNullValue
检查非 null
assertThat("", notNullValue());
sameInstance
- 检查相同的实例
assertThat($foo, is(not(sameInstance($foo2)))); assertThat($foo, is(sameInstance($foo)));
typeOf
- 检查类型
assertThat(1, typeOf("integer"));
notSet
- 检查实例属性是否未设置
assertThat($foo, notSet("name"));
set
- 检查实例属性是否已设置
$foo->name = "bar"; assertThat($foo, set("name"));
数字
closeTo
- 检查值是否接近某个范围
assertThat(3, closeTo(3, 0.5));
comparesEqualTo
- 使用 '==' 检查
assertThat(2, comparesEqualTo(2));
greaterThan
- 检查 '>'
assertThat(2, greaterThan(1));
greaterThanOrEqualTo
assertThat(2, greaterThanOrEqualTo(2));
atLeast
- 值是 >= 给定值
assertThat(3, atLeast(2));
lessThan
assertThat(2, lessThan(3));
lessThanOrEqualTo
assertThat(2, lessThanOrEqualTo(3));
atMost
- 值是 <= 给定值
assertThat(2, atMost(3));
String
emptyString
- 检查空字符串
assertThat("", emptyString());
isEmptyOrNullString
assertThat(null, isEmptyOrNullString());
nullOrEmptyString
assertThat("", nullOrEmptyString());
isNonEmptyString
assertThat("foo", isNonEmptyString());
nonEmptyString
assertThat("foo", nonEmptyString());
equalToIgnoringCase
assertThat("Foo", equalToIgnoringCase("foo"));
equalToIgnoringWhiteSpace
assertThat(" Foo ", equalToIgnoringWhiteSpace("Foo"));
matchesPattern
- 使用正则表达式模式匹配
assertThat("foobarbaz", matchesPattern('/(foo)(bar)(baz)/'));
containsString
- 检查子字符串
assertThat("foobar", containsString("foo"));
containsStringIgnoringCase
assertThat("fooBar", containsStringIgnoringCase("bar"));
stringContainsInOrder
assertThat("foo", stringContainsInOrder("foo"));
endsWith
- 检查以给定值结尾的字符串
assertThat("foo", endsWith("oo"));
startsWith
- 检查以给定值开头的字符串
assertThat("bar", startsWith("ba"));
类型检查
arrayValue
- 检查数组类型
assertThat([], arrayValue());
booleanValue
assertThat(true, booleanValue());
-
boolValue
-booleanValue
的别名 -
callableValue
- 检查值是否可调用
$func = function () {}; assertThat($func, callableValue());
doubleValue
assertThat(3.14, doubleValue());
floatValue
assertThat(3.14, floatValue());
integerValue
assertThat(1, integerValue());
-
intValue
-integerValue
的别名 -
numericValue
- 检查值是否是数值
assertThat("123", numericValue());
objectValue
- 检查对象
$obj = new stdClass; assertThat($obj, objectValue());
anObject
assertThat($obj, anObject());
resourceValue
- 检查资源类型
$fp = fopen("/tmp/foo", "w+"); assertThat($fp, resourceValue());
scalarValue
- 检查标量值
assertThat(1, scalarValue());
stringValue
assertThat("", stringValue());
XML
hasXPath
- 使用 xpath 检查 xml
$xml = <<<XML <books> <book> <isbn>1</isbn> </book> <book> <isbn>2</isbn> </book> </books> XML; $doc = new DOMDocument; $doc->loadXML($xml); assertThat($doc, hasXPath("book", 2));