Как предотвратить запуск события Laravel () во время юнит-тестов - PullRequest
0 голосов
/ 30 октября 2019

У меня есть класс, который использует глобальную функцию события () Laravel для запуска отдельного события при изменении модели. Единственный способ, которым я смог предотвратить это событие во время модульных тестов, - это фактически создать пространство имен, объявить новую функцию event () в самом тесте и заставить его ничего не делать. Это работает, но это не кажется мне симпатичным решением. Я просмотрел документы Laravel и вижу, что некоторые люди успешно использовали Event :: fake () внутри теста, но когда я пытаюсь это сделать, я получаю:

BadMethodCallException: Method Mockery_0_Illuminate_Contracts_Events_Dispatcher::until() does not exist on this mock object

Я нахожусь на Laravel 5.4,Есть ли более чистый способ предотвратить запуск этого события во время теста? Мне действительно не нравится идея объявления пустой функции namespaced event ().

РЕДАКТИРОВАТЬ:

Класс, который я тестирую, является классом UserDomain. В одной части логики он вызывает глобальный метод события () Laravel:

event(new RoleChanged($this->user));

Чтобы подавить это от запуска в тесте, я пробовал Event :: fake (), а также пытался использовать черту WithoutEventsи его метод безEvents (). Ни одна из них не работает, и та же самая ошибка, о которой я упоминал выше, возникает оба раза.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Я прочитал еще несколько документов по моделированию в модульном тестировании Laravel и обнаружил, что все, что мне нужно было сделать, это сделать это в начале теста:

$this->expectsEvents(RoleChanged::class);

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

0 голосов
/ 30 октября 2019

Вы должны использовать черту Illuminate\Foundation\Testing\WithoutEvents в своем тесте.

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutEvents;
use Illuminate\Foundation\Testing\RefreshDatabase;

class FooTest extends TestCase
{
    use WithoutEvents;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...