2016-10-06 3 views
7

をやったときにこれは私がやっている何How to wait for a page reload in Laravel integration testing私が認証をリロードしなければならないのはなぜ::ユーザー()統合テスト

のフォローアップでは、ユーザーのプロファイルを編集して、ビューを再表示することです。

マイプロフィールアクション:(UserControllerで)ビューは、私のテスト中に、今

{{ Auth::user()->firstname }} 

のようなコードが含まれています

public function profile(){ 
    return view('user/profile'); 
} 

、古い(変更なし)ユーザデータが表示されます。

テスト:

protected function editUserProfile() 
{ 
    $this->visit('/user/profile'); 
    $firstName = $this->faker->firstname; 
    $lastname = $this->faker->lastname; 

    $this->within('#userEditForm', function() use ($firstName, $lastname) { 
     $this->type($firstName, 'firstname'); 
     $this->type($lastname, 'surname'); 
     $this->press('Save') 
      ->seePageIs('/user/profile') 
      ->see($firstName) # here the test fails 
      ->see($lastname); 
    }); 
} 

私はこのようなUserControllerでの変更:

public function profile(){ 
    Auth::setUser(Auth::user()->fresh()); 
    return view('user/profile'); 
} 

すべてが正常に動作します。

今、私は理解したい、なぜそれがこのようなものか理解したい。

この場合、統合テストはブラウザと異なる動作をするのはなぜですか?その動作を調整するためのよりよい方法があるので、「本当の問題」がある場合にのみテストが失敗します。それとも私のコードは悪いですか?

+0

失敗テストの出力は何ですか? '#userEditForm'はどこに提出されますか、それはajaxですか?そうであれば、Laravelの基本テストスイートでajaxを使うことはできないと思うので、セレンを使う必要があります。このパッケージを見てください:https://github.com/Modelizer/Selenium – haakym

+0

これはAJAXではありません。ユーザー名をAliceからJohnに変更したときの出力は、「Johnが見えると思った」のようなものです。それで古いデータを取っています。私がAuth :: user()をリロードすると、すべて正常に動作します – Alex

+0

なぜあなたは使用しません: '$ this-> type($ firstName、 'firstname') - > type($ lastname、 'surname') - > see($ lastname); '($ lastname);を参照してください。ここで、テストは失敗します。 – user3482682

答えて

1

おそらくupdate (int $uid)をリクエストに使用していますか?

ほとんどの場合、Laravelはテスト中に単一のアプリケーションインスタンスしか使用しないという説明があります。それはあなたがそれを与える入力を取って、要求オブジェクトを構築し、それをコントローラメソッドに送信しています。ここからビューをレンダリングし、テキストが含まれていることを確認できます。認証の実装では

あなたはそれが2つのうちのいずれかをdoest Auth::user()呼び出し後:

  • どのユーザーが、それはストレージからそれを取得しようと読み込まれていない場合。
  • ユーザーが既に読み込まれている場合は、ユーザーがそれを返します。

私の推測しているアップデート方法は、キャッシュされたものではなく、ストレージからユーザーの新しいインスタンスを取得して更新することです。例えば

\Auth::loginUsingId(1234); 
\Auth::user()->email; // '[email protected]' 

$user = \App\User::find(1234); 
$user->email; // '[email protected]'; 

$user->update(['email' => '[email protected]']); 
$user->email; // '[email protected]' 

\Auth::user()->email; // '[email protected]' 
+0

しかし、Laravelは適切な分離を要求する際にオブジェクトをリセットしないでください。それとも、自分のコードを書く良い方法はありますか? – Alex

+1

@alex代わりにこのタイプのテストを行うには、Codeceptionのようなものを使用します。あなたのコードは大丈夫です、テストランナーは欠けています。 – Sturm

関連する問題