Как подделать DateTime в тесте phpunit? - PullRequest
0 голосов
/ 01 февраля 2019

ss Я пишу unittest, используя KernelTestCase Symfony и должен проверить функциональность, которая происходит только в определенный день (очень рано или слишком поздно).

Поэтому, когда я позволю своему тесту выполнитьполдень, конечно, ничего не происходит.Как я могу подделать системное время, притворяясь, что у него другое время, и мой тестовый пример запущен.

Я пробовал использовать класс ClockMock от Symfony, но он не работает.https://symfony.com/doc/current/components/phpunit_bridge.html#clock-mocking

Это мой тестовый код:

use Symfony\Bridge\PhpUnit\ClockMock;
use \DateTime;

/**
 * testUserAchievedEarlyBirdTrophy
 * @group time-sensitive
 */
public function testUserAchievedEarlyBirdTrophy()
{
    ClockMock::withClockMock(strtotime('2018-11-05 01:00:00'));
    echo (new DateTime())->format('Y-m-d H:m:s');

    $user8Id = $this->user8->getId();
    $progressSaveRequest = new ProgressSaveRequest($user8Id, $this->content_1_1->getId());

    $this->progressService->saveProgress($progressSaveRequest);

    $this->assertTrue($this->loggerCreator->hasDebugThatContains(
        'Early Bird'
    ));
}

эхо дает мне сегодняшнюю дату: 2019-02-01 16: 02: 06

У меня тоже былощущение, что ClockMock скорее используется для пропуска времени, например, для тестирования кэширования вместо sleep ().

Что я делаю не так?

В моем phpunit.xml есть вызов конфигурацииbin / simple-phpunit вызывает много случаев установки.

Разве я не могу использовать обычный phpunit?

Есть ли другие варианты подделки времени дня?

1 Ответ

0 голосов
/ 01 февраля 2019

По ссылке, которую вы указали в своем посте, первый абзац гласит:

Класс ClockMock, предоставляемый этим мостом, позволяет вам высмеивать встроенные в PHP функции времени time (), microtime (), спать () и уснуть ().Кроме того, функция date () проверяется, поэтому она использует проверенное время, если отметка времени не указана. Другие функции с необязательным параметром метки времени, который по умолчанию установлен на время (), будут по-прежнему использовать системное время вместо проверенного времени .(Акцент добавлен.)

Это означает, что ваш вызов

echo (new DateTime())->format('Y-m-d H:m:s');

должен дать системное время, а не проверенное время.

Изменить егона

echo date('Y-m-d H:m:s');

, чтобы соответствовать требованиям ClockMock и получить время для проверки.

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

...