An AOP powered test double library for PHP
$ composer require ray/test-double --dev
A Spy is a test double that records every invocation made against it and can verify certain interactions took place after the fact.
You can do it directly with newInstance
or specify it with a binding.
$spyLog = new SpyLog();
$spy = (new Spy())->newInstance(Foo::class, 'add', $spyLog);
// $spy records the 'add' method call
Specify the target to spy on by interface or class name.
$injector = new Injector(new class extends AbstractModule{
protected function configure(): void
{
$spyTargets = [
FooInterface::class,
];
$this->install(new SpyModule($spyTargets));
}
}
);
$spy = $injector->getInstance(Foo::class);
Specify the spying target using the Ray.Aop matcher.
$injector = new Injector(new class extends AbstractModule
{
protected function configure(): void
{
$this->install(new SpyBaseModule());
$this->bindInterceptor(
$this->matcher->any(), // any class
$this->matcher->startsWith('add'), // methods startWith 'add'
[SpyInterceptor::class]
);
}
});
$fake = $injector->getInstance(FakeAdd::class);
$spy = $injector->getInstance(Foo::class);
SpyLog::get($className, $methodName)
to get the log and make assertions.
public function testSpy()
{
$result = $foo->add(1, 2); // 3
$spy = $injector->getInstance(Spy::class);
// @var array<int, Log> $addLog
$addLog = $spyLog->getLogs(FakeAdd::class, 'add');
$subLog = $spyLog->getLogs(FakeAdd::class, 'sub');
$this->assertSame(1, count($addLog), 'Should have received once');
$this->assertSame(0, count($subLog), 'Should have not received');
$this->assertSame([1, 2], $addLog[0]->arguments);
$this->assertSame(1, $addLog[0]->namedArguments['a']);
}