Метод probibitdestructivecommands () не находится в базовом прокси -классе (DatabaseManager) его на фактическом классе фасада, что затрудняло это. Я потратил далеко, чтобы долго пытаться решить это и придумать решение, которое просто позволит E утверждать, что этот вызов метода присутствует. Быть возможным способом решения проблемы: < /p>
Код: Выделить всё
test('Invokes DB::prohibitDestructiveCommands in production', function () {
$this->app->detectEnvironment(fn() => 'production');
$mock = mock('overload:Illuminate\Support\Facades\DB');
$mock->shouldReceive('getFacadeRoot')
->once()->andReturn(new DB);
$mock->shouldReceive('prohibitDestructiveCommands')
->once()->with(true);
$this->provider->boot();
$mock->shouldHaveReceived('prohibitDestructiveCommands');
});
< /code>
Только одна проблема, что фасад уже загружен в это пространство имен и не может быть перегружен, поэтому он приводит к тесту, имеющему следующую ошибку: < /p>
Mockery\Exception\RuntimeException: Could not load mock Illuminate\Support\Facades\DB, class already exists
at vendor/mockery/mockery/library/Mockery/Container.php:401
at vendor/mockery/mockery/library/Mockery.php:681
at vendor/mockery/mockery/library/helpers.php:40
Примечание: я знаю, что мог бы обернуть метод, например, и издеваться над поставщиком, чтобы утвердить звонок этого метода, однако это не прекрасное решение для обеспечения поведения с помощью тестов, как призыв к Db :: probibitdestructivecommands (app ()-> isproduction ()) может быть удален или изменен в разработке в более позднее время из метода обертывания и тестов не будет забрать структурные изменения.
Я также знаю, что я могу проверить результат призывы к запрещенным командам, но это модульные тесты, и не должно быть подобным поведению по перекрестному тестированию, только структура класс.
Подробнее здесь: https://stackoverflow.com/questions/794 ... xied-class
Мобильная версия