мое приложение имеет библиотеку журналов с подписью:
final class Logger {
public static method debug($msg);
public static method warn($msg);
public static method error($msg);
}
класс, который я хочу проверить, другой глобальный статический помощник, используйте его как
final class TestMe {
public static method TestThis(){
Logger::debug('TestThis() called');
doThings();
}
}
Как протестировать класс TestMe
, издеваясь над Logger
и ожидая ожидаемых сообщений?
Класс Logger не может быть изделен PHPUnit по нескольким причинам.
final
что означает, что он не может быть расширен. Когда PHPUnit создает макет объекта, он создает новый объект, который расширяет класс, который насмехается. final
ключевое слово предотвращает расширение класса, поэтому макет не может быть создан.http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/
У вас есть два варианта тестирования таких вещей:
Logger
выполняется. Это сделает любые тесты менее "единичными" тестами, но они инкапсулируют ожидаемое поведение и все еще могут быть полезны.mockLogger
, который не вызывает статические методы. Это может быть более болезненным, но в результате ваш код станет более гибким.Если вы используете платформу тестирования, такую как PHPUnit, она предлагает возможность издеваться над объектом. Вы можете создать макет объекта для своего класса логгера и определить в нем метод отладки.
Здесь подробно объясняется:
https://phpunit.de/manual/current/en/test-doubles.html
Вот небольшой пример, взятый с этой страницы:
<?php
require_once 'SomeClass.php';
class StubTest extends PHPUnit_Framework_TestCase
{
public function testStub()
{
// Create a stub for the SomeClass class.
$stub = $this->getMockBuilder('SomeClass')
->getMock();
// Configure the stub.
$stub->method('doSomething')
->willReturn('foo');
// Calling $stub->doSomething() will now return
// 'foo'.
$this->assertEquals('foo', $stub->doSomething());
}
}
?>
->method()
в макете для статического класса, он не может сказать, что такого метода нет.
Limitations Please note that final, private and static methods cannot be stubbed or mocked.