hamcrest/hamcrest-php

这是 Hamcrest 匹配器的 PHP 版本

安装: 337 786 389

依赖: 114

建议: 1

安全性: 0

星标: 6 941

关注者: 16

分支: 45

开放问题: 16

v2.0.1 2020-07-09 08:09 UTC

This package is auto-updated.

Last update: 2024-09-08 08:29:32 UTC


README

tests

Hamcrest 是一个最初为 Java 编写的匹配库,但后来被移植到许多其他语言。hamcrest-php 是 Hamcrest 的官方 PHP 版本,本质上是对原始 Java API 的直接翻译,有一些例外,主要由于 PHP 语言障碍。

  1. instanceOf($theClass) 实际上是 anInstanceOf($theClass)

  2. both(containsString('a'))->and(containsString('b')) 实际上是 both(containsString('a'))->andAlso(containsString('b'))

  3. either(containsString('a'))->or(containsString('b')) 实际上是 either(containsString('a'))->orElse(containsString('b'))

  4. 除非匹配器这样做会失去语义,hamcrest-php 允许其输入动态类型,以“PHP方式”。例外的是,当类型本身的语义暗示了不同的情况时,例如 stringContains() 和 greaterThan()。

  5. 由于它们在 PHP 中没有意义或不适用,因此没有移植一些官方匹配器。

    • typeCompatibleWith($theClass)
    • eventFrom($source)
    • hasProperty($name) **
    • samePropertyValuesAs($obj) **
  6. 当大多数集合匹配器最终被移植后,由于 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 - 检查 __toStringtoString 方法
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));