sras / mockaway
This package is not auto-updated.
Last update: 2020-08-17 09:33:45 UTC
README
PHP 的模拟库
Mockaway 不会提供许多晦涩的函数和许多页面的文档,而是只提供少量结构,用户可以通过这些结构创建所需的模拟行为。这样,模拟对象的行为可以从其定义本身中明显看出,而不需要参考文档。
安装
在您的 composer.json 中要求此内容。
"sras/mockaway": "dev-default"
用法
从库返回的每个模拟对象都将有三个公共属性 expect、replace 和 unmetExpectations。属性 expect 和 replace 可以用于设置模拟行为。在任何时候,unmetExpectations 将包含尚未在对象上调用预期方法的名称。 原始构造函数永远不会被调用。
期望调用具有特定参数的方法,不指定返回值
<?php
$date_mock = Mockaway::Mock('Services\DateService');
// expect call to the method 'get' with argument 'now'
$date_mock->expect->get('now');
assert($date_mock->unmetExpectations === array('get'));
// after this call, the unmetExpectations is empty
$date_mock->get('now');
assert($date_mock->unmetExpectations === array());
一个期望将正好响应一个且仅一个调用。进一步的调用将导致抛出 UnexpectedCall 异常。
期望调用具有特定参数的方法并返回一个值
<?php
$date_mock = Mockaway::Mock('Services\DateService');
// expect call to the method 'get' with argument 'now' and return
// a fixed value
$date_mock->expect->get('now')->shouldReturn("2015-01-01");
assert($date_mock->unmetExpectations === array('get'));
// mock function returns the stored value
assert($date_mock->get('now') === '2015-01-01');
assert($date_mock->unmetExpectations === array());
与之前一样,一个期望将正好响应一个且仅一个调用。进一步的调用将导致抛出 UnexpectedCall 异常。
检查是否收到了所有期望的调用
如果对模拟对象的所有期望调用都已执行,则 unmetExpectations 将包含一个空数组。如果没有,则它将包含未按预期调用的方法的名称。
使用回调响应调用
您可以将回调设置为执行,该回调由原始调用传递的参数执行。此方法不使用 unmetExpectations 属性跟踪调用。这将响应对模拟对象上此方法的任何数量的进一步调用。
<?php
$date_mock = Mockaway::Mock('Services\DateService');
// mock the get function to return a date two days after the passed date.
$date_mock->replace->get->with( function($str) {
$date= new DateTime($str, new DateTimeZone('GMT'));
$date->modify("2 Days");
return $date->format("Y-m-d");
});
assert( $date_mock->get("2015-01-01") === "2015-01-03");
// can be called any number of times
assert( $date_mock->get("2015-01-01") === "2015-01-03");
assert( $date_mock->get("2015-01-04") === "2015-01-06");
UnexpectedCall 异常
当模拟对象使用它未期望的方法/参数组合被调用时,它将抛出 UnexpectedCall 异常。您可以使用此异常的 getMethod 和 getArguments 方法来确定触发它的确切调用。
Unexpectedcall 观察者
上述提到的 UnexpectedCall 异常可能永远不会到达期望它们的代码,因为某些中间代码捕获了它们。因此,为了确保您收到所有未预期的调用信息,请使用观察者。您可以使用模拟对象的 unexpectedCallObservers 数组属性向模拟对象添加观察者。观察者可以是可调用的,也可以是具有 "notify()" 方法的对象。观察者将接收 \UnexpectedCall Exception 对象作为其参数。因此,即使实际的异常被中间代码捕获,您仍然可以通过通知调用获取原始异常。
它是如何工作的?
当创建模拟时,该库使用反射API构建一个继承自源对象的类的源代码。该模拟对象中的方法仅包含对存储在 expect 和 replace 属性中的对象的调用。这些对象是用户用来使用回调设置期望或行为的对象。当模拟对象接收到调用时,它首先检查 expect 对象是否已设置为期望该精确调用。如果是,它会检查是否指定了返回值,如果找到则返回它。否则返回null,并从期望调用列表中移除该调用。如果它没有在期望对象中找到该调用,它将检查 replace 对象以查看是否提供了回调。如果有的话,它将使用参数调用回调并返回返回值。如果没有,它将抛出 UnexpectedCall 异常。
就是这样!