私はCartCookie
クラスをインスタンス化してショッピングカートを保存する独自のクッキーを生成するサービスプロバイダを持っています。これはシングルトンクラスであり、サービスコンテナに注入されます。 CartCookie
クラスでユニットテスト中にサービスプロバイダでLaravel Cookieが利用できない
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;
}
}
私はcart_id
クッキーの存在を確認。アプリケーションを使用すると完全に正常に動作します!
私の問題は、ユニットテスト中にcart_id
のクッキーが空であることですが、Request
がサービスプロバイダーから来た場合にのみ発生します。たとえば、ライフサイクルの後でコントローラからRequest
を取得すると、そのクッキーが存在します。ここで
はテストの例です:
/** @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()
ときに私は存在を伝えることができます。何らかの理由で、単体テストの間だけ、リクエストにまだサービスプロバイダにクッキーが含まれていません。
希望はこれが理にかなっています。ここから
これは理にかなっていますか? –
@DoniiHoho私はそれについては分かりません。 '$ this-> call()'はまったく新しいリクエストを開始しています。 – Wasim
新しい要求を作成して、同じスクリプト実行内のルートに渡します。これは、シングルトンとしてマークしているためです。ここに問題があります。 –