#php #unit-testing #phpunit
#php #модульное тестирование #phpunit
Вопрос:
Я хочу, чтобы во всех моих тестах был поддельный объект, поэтому я пытаюсь создать его в методе setUpBeforeClass(), но этот метод статический, поэтому getMockBuilder должен вызываться статически следующим образом:
public static function setUpBeforeClass() {
self::mocked_object = self::getMockBuilder('MockedClass')
->disableOriginalConstructor()
->getMock();
}
Проблема в том, что getMockBuilder нельзя вызвать статически :
Argument 1 passed to PHPUnit_Framework_MockObject_MockBuilder::__construct() must be an instance of PHPUnit_Framework_TestCase, null given
Есть ли какой-либо шанс создать поддельный объект в методе setUpBeforeClass или я должен создавать его каждый раз перед тестированием (в методе общедоступной функции setUp())?
Комментарии:
1. зачем вам нужен макет там? разве вы не можете просто настроить его в обычном методе установки или в тесте? если вы собираетесь настраивать ожидания для макета, вы не хотите, чтобы он создавался только один раз, а для каждого теста.
2. методы mocked_object всегда будут возвращать одни и те же результаты, поэтому я подумал, что лучше создать его экземпляр только один раз… В любом случае, я мог бы создать его в методе setup, но я хотел бы знать, можно ли его создать и в setUpBeforeClass .
3. Не уверен, возможно ли это, но я бы сказал, что это плохая практика, поскольку вам нужна чистая заглушка для каждого теста на изоляцию.
Ответ №1:
Каждый макет объекта привязан к экземпляру тестового примера, который его создал. Поскольку setUpBeforeClass()
это статический метод, он не имеет экземпляра и не может создавать фиктивные объекты.
Вместо этого создайте свои mocks в setUp()
или вспомогательные методы и либо назначьте их переменным экземпляра, либо верните их.
class MyServiceTest extends PHPUnit_Framework_TestCase
{
function setUp() {
$this->connection = $this->getMock('MyDatabaseConnection', array('connect', ...));
$this->connection
->expects($this->once())
->method('connect');
}
function testLogin() {
$this->connection
->expects($this->once())
->method('login')
->with('bob', 'p4ssw0rd');
$service = new MyService($this->connection);
self::assertTrue($service->login('bob', 'p4ssw0rd'));
}
}