PHPUnit тестирует флеш-сообщение с ключом и параметрами в CakePHP 3.5 - PullRequest
0 голосов
/ 09 июня 2018

CakePHP Версия: 3.5.17PHPUnit: 6.5.8

Сообщение в пользовательском контроллере добавляет действие:

$this->Flash->my_message_to_test('', [
    'key' => 'message',
        'params' => [
        'p1' => __('SUCCESS - The '),
        'p2' => __($user->role),
        'p3' => $user->first_name,
        'p4' => $user->last_name,
        'p5' => __('has been created.')
    ]
]);

Как я отрендерю его в моем представлении добавления пользователя: $ this-> Flash-> render ('message')


Я искал пример, но не смог найти столько информации о нем, но нашел this пост, который помог мне создать модульный тест следующим образом с небольшим количеством проб и ошибок:

$ this-> assertSession ('SUCCESS - была создана Supercser Abc Def.', 'Flash.flash.key '==' message.0.message ');

Когда я запустил тест, клиент выдал следующую ошибку:

Ошибка - InvalidArgumentException: InvalidПараметр, должен быть разделенным точками путем или массивом.

Имея эту информацию, я пробовал множество способов восстановить это утверждение, но все же не повезло.

Мой вопрос / запрос:

Может ли кто-нибудь помочь мне сконструировать это утверждение для включения прохода?

Спасибо, З.


@ ndm,

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

ATTEMPT 1: // Попробуйте использовать конкатенацию для добавления значения ключа к пути, потому что текущий путь использует его.

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', 'Flash.flash.key.message.0.message');

ATTEMPT 2: // Попробуйте добавить к текущему пути.

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', 'Flash.flash/key/message.0.message');

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', 'Flash.flash?key=message.0.message');

ATTEMPT 3: // Попробуйте определить значение ключа как сообщение.

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', "Flash.flash.'key'=>'message'.".'0.message');

ATTEMPT 4: // Попробуйте использовать массив для определения значения ключа в качестве сообщения.(Смоделируйте метод определения контроллеров)

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', "Flash.flash.['key'=>'message'].".'0.message');

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', "Flash.flash['key'=>'message'].".'0.message');

Сводка

К сожалению, все мои попытки приводят к следующей ошибке cli:

Ошибка при утверждении этого нуляожидаемых матчей 'УСПЕХ ...'

Я действительно не могу придумать ничего другого, чтобы попытаться, что имеет смысл для меня.Если он показывает ноль, это будет означать, что путь не указывает на правильный ресурс, что означает, что конструкция пути неверна?

И если это правильно, я не уверен, что еще попытаться построить этопуть правильно?


@ Грег Шмидт, спасибо за ваш комментарий.Я до сих пор не могу распознать ключ?Я по-прежнему получаю сообщение об ошибке, утверждающее, что нулевое значение соответствует ожидаемому «УСПЕХУ ...»

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

usersCorporateController- Зарегистрировать действие

$this->Flash->error(__('Please correct the errors!'));

usersCorporate - Просмотр реестра

$this->Flash->render()

usersCorporateControllerRegisterErrorMessageTest - Регистрация теста

$this->enableRetainFlashMessages();

$this->assertSession('Please correct the errors!', 'Flash.flash.0.message');

И это работает.

Затем я создаю тест для своего пользователя. Добавление действия контроллера.Разница в том, что это сообщение использует ключ и объявлено в представлении ниже.(Пожалуйста, найдите код в верхней части сообщения)

пользователей - Добавить представление

$this->Flash->render('message') // Different

Я знаю, что мой тест добавления действия работает, и я добавляю следующее к тесту.

usersControllerAddTest - Добавить тест

$this->enableRetainFlashMessages();

$this->assertSession('SUCCESS - The Superuser Abc Def has been created.', 'Flash.flash.0.message');

И я получаю эту ошибку в cli:

Ошибка, утверждающая, что нулевое значение соответствует ожидаемому 'УСПЕХУ ... '

И я думаю, что это правильно, потому что у него нет никакого способа разграничить сообщения, как он узнает, как ссылаться на сообщение с помощью ключа?

И вот когдаЯ начинаю искать ответ и начинаю пытаться построить утверждение со ссылкой на ключ.

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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Другая попытка:

У меня нет решения, но я подумал, что напишу это, чтобы помочь кому-нибудь в будущем, кто пытается проверить флэш-сообщение с ключом.

Я начал снова и последовал примеру поваренных книгбуквально.Я ссылался на следующую информацию в Поваренной книге:

https://book.cakephp.org/3.0/en/controllers/components/flash.html

В этом разделе подробно описано следующее.

// In your Controller
$this->Flash->success('The user has been saved', [
    'key' => 'positive',
    'params' => [
        'name' => $user->name,
        'email' => $user->email
    ]
]);

// In your View
<?= $this->Flash->render('positive') ?>

// In src/Template/Element/Flash/success.ctp
<div id="flash-<?= h($key) ?>" class="message-info success">
    <?= h($message) ?>: <?= h($params['name']) ?>, <?= h($params['email']) ?>.
</div>

На этом основании у меня есть следующий код вмое приложение.

// Users controller add action.
$this->Flash->success('The user has been saved', [
    'key' => 'positive',
    'params' => [
        'firstname' => $user->first_name,
        'lastname' => $user->last_name
     ]
]);

// Users Add View.
<?= $this->Flash->render('positive') ?>

// In src/Template/Element/Flash/success.ctp
<div id="flash-<?= h($key) ?>" class="message-info success">
    <?= h($message) ?>: <?= h($params['firstname' ]) ?>, <?= h($params['lastname' ]) ?>.
</div>

И это работает, когда пользователь добавляется сообщение с параметрами отображается.Отображаемое сообщение:

Пользователь был сохранен: Abc, Def.

Результат теста:

Утверждение в тесте построенокак описано ниже:

$ this-> assertSession ('Пользователь был сохранен: Abc, Def.', 'Flash.flash.0.message');

И результат вcli:

Ошибка, подтверждающая, что нулевое совпадение ожидается 'Пользователь был сохранен: Abc, Def.'.

Результаты отладки:

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

// Users controller add action.
$this->Flash->success('The user has been saved', [
    //'key' => 'positive', // REMOVED KEY REF
    'params' => [
        'firstname' => $user->first_name,
        'lastname' => $user->last_name
     ]
]);

// Users Add View.
<?= $this->Flash->render() ?> // REMOVED KEY REF

    // In src/Template/Element/Flash/success.ctp
<div class="message-info success"> // REMOVED KEY REF
    <?= h($message) ?>: <?= h($params['firstname' ]) ?>, <?= h($params['lastname' ]) ?>.
</div>

И это все еще работает, когда пользовательдобавлено сообщение с параметрами.Отображаемое сообщение:

Пользователь был сохранен: Abc, Def.

Результат теста:

Утверждение в тесте построенокак подробно описано ниже:

$ this-> assertSession ('Пользователь был сохранен: Abc, Def.', 'Flash.flash.0.message');

И результат вCli:

Не удалось утверждать, что две строки равны:--- Ожидаемое+++ Actual@@ @@-Пользователь был сохранен: Abc, Def.+ 'Пользователь был сохранен'

Параметры не соответствуют фактическому результату, и после сохранения нет двоеточия (:) после?

Сводка

Почему этот тест не прошел?Я неправильно истолковал документацию?

Приветствия Z.

...