Laravel - фальсификация сбоя сохранения в модульных тестах - PullRequest
0 голосов
/ 03 июня 2019

Если бы у нас был приведенный ниже код, который мы хотели бы протестировать, каков был бы лучший способ имитировать неудачное сохранение?На данный момент единственная часть, которую я пропускаю в своем тесте, - это оператор else.

Сохранение является частью цикла, в котором мы $customers проводим цикл и выполняем некоторые действия.

$customers = Customer::where('created_at', '<=', $start);

$customers->each(function ($customer, $key) {
    if ($customer->save()) {
        //Do something here
    } else {
        //Saving failed, log something
    }
}

Все данные для тестов поступают с заводов и генерируются на лету для каждого теста.

1 Ответ

0 голосов
/ 03 июня 2019

Что ж, простая, но грязная вещь - это подделать сбой сохранения через событие saving:

Вот примечание от обработчика события:

public function save(array $options = [])
{
    $query = $this->newModelQuery();

    // If the "saving" event returns false we'll bail out of the save and return
    // false, indicating that the save failed. This provides a chance for any
    // listeners to cancel save operations if validations fail or whatever.
    if ($this->fireModelEvent('saving') === false) {
        return false;
    }
   ....

Поэтому что-то вродедолжно работать следующее:

class TestModelSaving {
     public function testSaveFailureLogs() {
          // Create the fake model here
          // If the event handler for saving returns false then `save()` will return false
          Customer::saving(function () { return false; }); 
          // Call your unit under test here

          // Cleanup: Usually unnecessary, but some test configurations might need it
          Customer::flushEventListeners();

     }
}

Для проверки того, что что-то зарегистрировано, вы можете смоделировать фасад регистратора с помощью Log::shouldReceive(....) (параметры для функции насмешки с тем же именем совпадают)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...