#php #symfony #testing #behat
#php #symfony #тестирование #как выполнить
Вопрос:
Я запускаю команду Symfony CLI, которая работает с транзакциями за последний месяц. Это CLI — я не могу просто издеваться над системными часами, так как мне протестировать это с помощью Behat? Сейчас ноябрь, следующий сценарий завершится неудачей в декабре:
Scenario: Do something with last month transactions
Given there is a transaction "7ccf7387" for 2020-10
And there is a transaction "39d7f278" for 2020-10
When I execute "bin/console billing:last-month" from project root
Then command should succeed
And output should contain "Closed 2 transactions"
Это текущая реализация команды:
final class CloseLastMonth extends Command
{
/* ... */
protected function execute(InputInterface $input, OutputInterface $output): int
{
$month = (GregorianCalendar::UTC())->currentMonth()->previous();
$trxs = $this->bus->dispatch(new GetActiveTrxsByMonthQuery($month));
foreach ($trxs as $trx) {
$this->bus->dispatch(new CloseTransactionCommand($trx->id));
}
$this->io->success(sprintf('Closed %d transactions', count($trxs)));
return 0;
}
/* ... */
}
Я мог бы заставить пользователя всегда передавать текущий месяц в аргументах команды, но это неэлегантно. Новый сервис Symfony, который всегда возвращает текущий месяц, является излишеством.
Комментарии:
1. Почему именно это не сработает в декабре?
2. @Nico потому что даты в сценарии указаны на октябрь.
3. Ах, глупый я ….. итак, почему бы не вставлять светильники динамически (так, чтобы они всегда вставлялись за последний месяц на основе выполнения, а не фиксировались на октябрь 2020 года)?
Ответ №1:
Лучше напишите свое собственное определение шага:
/**
* @Given /^There is a transaction "([^"]*)" for last month$/
*/
public function thereIsATransaction(string $transactionId) {}
Таким образом, вы можете просто сделать:
Given there is a transaction "7ccf7387" for last month
And there is a transaction "39d7f278" for last month