2017-01-24 3 views
0

У меня есть поставщик услуг, который создает класс 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 еще в поставщике услуг.

Надеюсь, что это имеет смысл.

+0

Это имеет смысл, потому что сначала загружены поставщики услуг, а затем модульного тестирования вызов маршруту выполняется? –

+0

@DoniiHoho Я не уверен в этом, '$ this-> call()' запускает совершенно новый запрос. – Wasim

+0

Создает новый запрос и передает его маршрутам, но в рамках одного и того же сценария, так как вы отметили его как одноэлементный, вот в чем проблема. –

ответ

2

Отсюда: link

Try:

/** @test */ 
public function get__store_checkout__checkout_displays_database_cart_correctly() 
{ 
    $cart = $this->createDatabaseCart(); 

    $cookie = ['cart_id' => Crypt::encrypt($this->cartCookie)]; 

    //@TODO you must get the current request 
    //@TODO you must set $cookie to $request 
    //Or simply find a way to create the CartCookie you need using the $cookie from above 
    $cartCookie = new CartCookie($request); 

    //hopefully will swap the CartCookie::class instance 
    app()->instance(CartCookie::class, $cartCookie); 

    //Now that you have the 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()); 
    }); 
} 
+0

Теперь я вам сейчас. Я был под впечатлением '-> call()' был больше похож на запрос ajax, который будет создавать экземпляр приложения каждый раз, но теперь я вижу иначе. Я изменил тест, чтобы перейти сейчас, используя вариант вашего примера '$ cartCookie = app (CartCookie :: class); $ CartCookie-> SETID ($ this-> cartCookie); app() -> instance (CartCookie :: class, $ cartCookie); 'Не идеально, но тест проходит так спасибо за вашу помощь и учит меня чему-то новому :) – Wasim

+0

Привет, друг, рад, что это помогло! –

Смежные вопросы