У меня есть поставщик услуг, который создает класс CartCookie
, который генерирует уникальный файл cookie для сохранения корзин покупок. Это одноэлементный класс, который вводится в контейнер обслуживания.Печенье Laravel недоступно в поставщике услуг во время модульного тестирования
CartCookieServiceProvider.php
public function boot(Request $request)
{
$this->app->singleton(CartCookie::class, function ($app) use ($request) {
return new CartCookie($request);
});
}
CartCookie.php
use App\Cart;
use Illuminate\Http\Request;
class CartCookie
{
private $id;
private $request;
function __construct(Request $request)
{
$this->request = $request;
if ($request->cookie('cart_id')) {
$this->id = $request->cookie('cart_id');
} else {
$this->id = $this->generateUniqueCartId();
}
}
public function id()
{
return $this->id;
}
private function generateUniqueCartId()
{
do {
$id = md5(time() . 'cart' . rand(100000000000000, 9999999999999999));
} while (Cart::find($id));
return $id;
}
}
В CartCookie
классе я проверяю для существования cart_id
печенья. Работает отлично при использовании приложения!
Моя проблема заключается в том, что при модульных тестах cookie cart_id
пуст, но только когда Request
поступает от поставщика услуг. Если я получу Request
из Контроллера позже, например, в жизненном цикле, присутствует файл cookie.
Вот пример теста:
/** @test */
public function get__store_checkout__checkout_displays_database_cart_correctly()
{
$cart = $this->createDatabaseCart();
$cookie = ['cart_id' => Crypt::encrypt($this->cartCookie)];
$response = $this->call('get', route('root.store.checkout'), [
'seller_id' => $cart->seller->id,
], $cookie);
$cart->seller->items()->each(function ($item) use ($response) {
$this->assertContains($beat->item, $response->getContent());
});
}
я могу сказать о существовании, когда я dd()
на запрос куки как поставщика услуг, и контроллер, который обрабатывает функциональность корзины. По какой-то причине, только во время модульных тестов, запрос не содержит cookie еще в поставщике услуг.
Надеюсь, что это имеет смысл.
Это имеет смысл, потому что сначала загружены поставщики услуг, а затем модульного тестирования вызов маршруту выполняется? –
@DoniiHoho Я не уверен в этом, '$ this-> call()' запускает совершенно новый запрос. – Wasim
Создает новый запрос и передает его маршрутам, но в рамках одного и того же сценария, так как вы отметили его как одноэлементный, вот в чем проблема. –