Как создать поддельный объект в методе setUpBeforeClass phpunit?

#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'));
    }
}