pr0ggy / nark
PHP 的监视/存根库
Requires
- php: >=5.6.0
- equip/structure: ^1.1
- hamcrest/hamcrest-php: ^2.0
Requires (Dev)
- phpunit/phpunit: ^5.7
README
Nark 是一个轻量级的监视/存根库,用于 PHP >= 5.6,旨在与 PHPUnit 或任何其他测试框架一起使用。其目标是简洁地完成一件事情:提供一种创建测试替身对象的方法,这些对象可以提供预编程的行为,然后报告它们是如何被使用的。Nark 力求在平均使用情况下实现简洁和实用性,而不是提供庞大的接口和功能集以覆盖所有可能的场景。
安装
composer require --dev pr0ggy/nark
使用
创建匿名间谍
匿名间谍适合那些你不必担心创建特定类型的测试替身,只需要一个能够以预期方式响应方法调用的对象的场景。
// anonymous spy where all method invocations will return null $spy = Nark\createAnonymousSpy(); // or an anonymous spy with stubbed methods $spy = Nark\createAnonymousSpy([ 'doFoo' => Nark\returnsStaticValue('bar'), 'doBaz' => Nark\returnsInSequence('fizz', 'fazz'), 'doBiz' => Nark\throwsException(new InvalidArgumentException()), 'doBuzz' => function ($arg1, $arg2) { return ($arg1 + $arg2); } ]);
要在创建的间谍上存根方法,只需传递一个如下格式的映射
[method name] => [invocation handler callable]
上述示例中使用的 3 个 Nark 便利方法在下面的 API 文档 中进行了解释。调用处理程序也可以作为原始函数提供,这些函数将接受所有调用参数,如上例中的 'doBuzz' 处理程序。
创建类型间谍
创建用于替换给定类或接口的测试替身的方法的原理非常相似
// create spy of type \Foo\Bar where all method invocations will return null $spy = Nark\createSpyInstanceOf('\Foo\Bar'); // or a spy of type \Foo\Bar with stubbed methods $spy = Nark\createSpyInstanceOf('\Foo\Bar', [ 'doFoo' => Nark\returnsStaticValue('bar'), 'doBaz' => Nark\returnsInSequence('fizz', 'fazz'), 'doBiz' => Nark\throwsException(new InvalidArgumentException()), 'doBuzz' => function ($arg1, $arg2) { return ($arg1 + $arg2); } ]);
查询间谍
Nark 提供了一种非常直接的方式来查询测试替身关于其如何被使用的情况。对于 Nark 间谍实例,有 3 个主要的查询可用
$spy = Nark\createAnonymousSpy(); doSomethingWith($spy); $spyInvocations = $spy->reflector(); // 1. How many times was a given spy method invoked... // ...with no arguments? $this->assertTrue(count($spyInvocations->doFoo()) > 0); // ...with a particular set of arguments? $this->assertTrue(count($spyInvocations->doFoo('foo', false)) > 0); // ...with particular categories of arguments using Hamcrest matchers? $this->assertTrue(count($spyInvocations->doFoo(startsWith('foo'), anything())) > 0); // ...or how many times a method was invoked with any arguments or no arguments $this->assertTrue(count($spyInvocations->doFoo) > 0); // 2. Did a given set of invocations occur in chronological order? $this->assertTrue(Nark\occurredChronologically([ $spyInvocations->doFoo('foo'), $spyInvocations->doFoo('bar'), $spyInvocations->doFoo('baz') ])); // 3. Did a given set of invocations occur in strict sequence? $this->assertTrue(Nark\occurredSequentially([ $spyInvocations->doFoo('foo'), $spyInvocations->doFoo('bar'), $spyInvocations->doFoo('baz') ]));
请参阅下面的 API 文档,了解允许您查询间谍实例如何被使用的函数。
Nark API
以下函数在 Nark\
命名空间中可用
createAnonymousSpy(array $methodNameToResponderMap = [])
创建一个具有可选方法存根的匿名间谍实例。所有未存根的方法调用将返回 null。
createSpyInstanceOf($type, array $methodNameToResponderMap = [])
创建一个具有可选方法存根的给定 $type
(类或接口)的间谍实例。所有未存根的方法调用将返回 null。
occurredChronologically(...$sequenceOfMatchedInvocationRecordLists)
接受从给定的间谍反射器(见下文的 Spy Reflector API)查询的任何给定数量的调用列表,并在可以从每个给定列表中拉出一个新列表的情况下返回 true,该新列表包含按时间顺序发生的调用。
occurredSequentially(...$sequenceOfMatchedInvocationRecordLists)
类似于occurredChronologically,返回是否可以通过调用列表垂直追踪路径,连接一系列按顺序发生的调用(一个紧接着另一个,中间没有其他方法调用)。
returnsStaticValue($staticValueToReturn)
返回一个始终返回给定静态值的函数占位符调用处理程序,正如它被给到这个函数一样。
returnsInSequence(...$sequenceOfValuesToReturn)
返回一个方法占位符调用处理程序,它将在顺序调用中返回给定的值序列。第一个参数对应于第一次调用的期望返回值,第二个参数对应于第二次调用,等等。一旦序列被用完,后续的所有调用将返回null
。注意,给此函数作为参数的函数将在方法调用时作为原始函数返回(它们不会调用以生成返回值)...请参见下面的Nark\valueReturnedBy
以包装应调用而不是作为原始值返回的函数。
valueReturnedBy($callable)
在传递函数给Nark\returnsInSequence
函数时使用,以表示不应作为原始值返回,而应调用以计算调用的返回值。
$spy = Nark\createAnonymousSpy([ 'doBar' => Nark\returnsInSequence( function () { return 'foo'; }, // the raw function will be returned on 1st invocation Nark\valueReturnedBy(function () { return 'foo'; }) // 'foo' will be returned on 2nd invocation ) ]);
throwsException(Exception $exception)
返回一个方法占位符调用处理程序,当调用时会抛出给定的异常。
间谍API
除了通过实现接口或扩展类来定义的任何方法以外,间谍实例还具有以下方法
$spy->reflector()
返回一个间谍对象的SpyReflector
实例,可以用来查询对间谍的调用(请参阅下面的Reflector API)。
间谍反射器API
一个SpyReflector
实例没有自己的具体方法。相反,它使用PHP魔术方法来允许用户调用反射器上的方法,就像它们是在间谍本身上被调用一样。这样做会返回一组记录在间谍实例上的调用,这些调用与对反射器实例的调用相匹配。请参见上面的代码示例以获取具体示例。
测试
./vendor/bin/phpunit test/
许可
GNU公共许可证第3版