我有一个服务提供商,它实例化了一个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
cookie为空,但仅当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
它创建一个新的请求并将它传递给路由,但在同一个脚本执行中,因为你已经将它标记为单例,这就是问题所在。 –