Ich habe einen Service-Provider, der eine CartCookie
Klasse instanziiert, die ein einzigartiges Cookie zum Speichern von Einkaufswagen generiert. Es ist eine Singleton-Klasse und es wird in den Service-Container injiziert.Laravel-Cookies nicht im Service-Provider während der Unit-Tests
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;
}
}
In der CartCookie
Klasse I für die Existenz überprüfen eines cart_id
Cookie. Funktioniert perfekt, wenn Sie die Anwendung verwenden!
Mein Problem ist, dass während Unit-Tests der cart_id
Cookie leer ist, aber nur wenn der Request
vom Service-Provider kommt. Wenn ich beispielsweise später im Lebenszyklus die Request
von einem Controller erhalte, ist der Cookie vorhanden. Hier
ist ein Beispiel für einen Test:
/** @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());
});
}
Ich kann die Existenz sagen, wenn ich die Anfrage Cookies dd()
sowohl im Service-Provider und die Steuerung, die den Warenkorb Funktionalität verarbeitet. Aus irgendeinem Grund, nur während Komponententests, enthält die Anfrage das Cookie noch nicht bei dem Dienstanbieter.
Hope das macht Sinn.
Dies macht Sinn, da Diensteanbieter und dann Einheit Testanruf nach Route geladen werden ausgeführt? –
@DoniiHoho Ich bin mir nicht sicher, '$ this-> call()' beginnt eine ganz neue Anfrage. – Wasim
Es erstellt eine neue Anfrage und übergibt sie an die Routen, aber innerhalb der gleichen Skriptausführung, da Sie es als Singleton markiert haben, hier liegt das Problem. –