Макет фасада Illuminate Config без Laravel

Я работаю над пакетом, который опирается на фасад Config. Сам код работает нормально, но при тестировании возникают проблемы.

Изначально я использовал этот код:

Config::shouldReceive('foo.bar')
    ->andReturn(true);

Как и многие другие, я столкнулся с некоторыми проблемами.

Позже я прочитал, что насмешка над Config фасадом не поощряется.

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

Config::set('foo.bar', true);

Что, я считаю, отлично работает, если вы тестируете Laravel/Lumen.

Но моя проблема в том, что я не такой. Я просто полагаюсь на несколько Illuminate пакетов, так что это не сработает, так как я получаю: RuntimeException: A facade root has not been set.

На этом этапе некоторые могут предложить мне просто внедрить зависимость репозитория Config, но я использую фасад Config в трейте, который используется моделью Eloquent, поэтому DI не будет работать.

Есть ли другой способ справиться с этим?

Спасибо!

PS: этот вопрос также был опубликован на Ларакасты


person Quetzy Garcia    schedule 13.02.2017    source источник


Ответы (2)


Я столкнулся с той же проблемой. Люмен 5.4 с использованием Config::set('key', 'value') не работал. Поэтому мне пришлось использовать этот способ.

//test
use Illuminate\Support\Facades\Config;

Config::shouldReceive('get')
                    ->once()
                    ->with('key')
                    ->andReturn('value');

,

//code
use Illuminate\Support\Facades\Config;

Config::get('key'); //instead config('key');
person Dumindu Madunuwan    schedule 19.07.2017
comment
Ваша проблема не связана с моей. Вы используете Lumen, в котором по-прежнему есть большинство пакетов Illuminate, поэтому пакет Config::set() должен работать до тех пор, пока вы включаете Facades в пакете bootstrap/app.php. Мой вариант использования — тестирование пакета Laravel/Lumen в автономной среде, где в вашем распоряжении нет всей инфраструктуры, поэтому вам приходится полагаться на Testbench. Кроме того, как указано в документации, насмешка над Config не является лучшей практикой. Отсюда и минус. - person Quetzy Garcia; 19.07.2017

Для тех, кто сталкивается с подобной проблемой, я наконец нашел правильный способ решения этой проблемы.

Пакет Testbench предназначен для тестирования пакетов Laravel.

Из документации:

Чтобы использовать компонент Testbench, все, что вам нужно сделать, это расширить Orchestra\Testbench\TestCase вместо PHPUnit\Framework\TestCase.

Таким образом, установка значения конфигурации — это просто вызов Config::set(), как при полной установке Laravel. Нет больше Mockery проблем.

person Quetzy Garcia    schedule 05.03.2017