@midia21

Как в phpunit мокнуть одну функцию класса и оставить реализацию всех остальных (в том числе тестируемой)?

Только начинаю погружаться в тестирование. Встала задача протестировать функцию модели, которая вызывает функции обновления базы данных. Прочитал, что тестить базу данных напрямую довольно сложно и решил просто мокнуть метод, который обновляет значения в бд. Вот примерный код того, что я имею ввиду:

class Model {
  // метод который нужно мокнуть
  public function update($values) 
  {
    global $db;
    $db->query('update ...');
  }

  // функция которую нужно протестить
  public function change_time($start_time)
  {
    $end_time = $start_time + 1;

    $this->update([
      'start_time', $start_time,
      'end_time', $end_time
    ]);
  }
}


Естественно, в реальном приложении более сложные данные, и мне нужно проверить их корректность. По сути мне просто нужно отловить входящие данные в функцию update. Что-то вроде этого:

public function testEndTimeShouldBeCorrect()
{
  $mock = $this->getMockBuilder(Model::class)
    ->setMethods(['update'])
    ->getMock();

  $mock->expects($this->once())
    ->method('update')
    ->with($this->equalTo(5));


  Model::change_time(4);
}


Подозреваю, что того о чем спрашиваю вряд-ли можно добиться, но буду благодарен если подскажите любую возможность протестить данный кейс. Спасибо.

P.S. Наверное можно возвращать в функции change_time данные, которые нужно проверить. Но думаю это будет выглядеть нелогично с точки зрения логики программы, и жертвовать этим ради тестов не стоит.
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Не используйте глобальные переменные, а внедряйте зависимость, тогда сможете поменять объект и тестировать то, что нужно.

Наверное можно возвращать в функции change_time данные, которые нужно проверить. Но думаю это будет выглядеть нелогично с точки зрения логики программы, и жертвовать этим ради тестов не стоит.

Как раз наоборот, не правильно все смешивать. Обрабатывайте объект, меняйте в нем время или что нужно, а сохранение этого объекта в бд совсем другая операция.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы