2016-10-06 22 views
7

Đây là một sau lên của How to wait for a page reload in Laravel integration testingTại sao tôi phải để tải lại Auth :: dùng() khi thực hiện hội nhập thử nghiệm

Những gì tôi đang làm là để chỉnh sửa hồ sơ của người dùng và sau đó hiển thị lại xem.

hành động Hồ sơ của tôi: (UserController)

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

Quan điểm chứa mã như

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

tại trong thử nghiệm của tôi, người già (không thay đổi) dữ liệu người dùng được hiển thị.

Các thử nghiệm:

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); 
    }); 
} 

Khi tôi thay đổi UserController như thế này:

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

tất cả mọi thứ hoạt động tốt.

Bây giờ tôi muốn hiểu, tại sao lại như thế này.

Tại sao thử nghiệm tích hợp hoạt động khác với trình duyệt trong trường hợp đó? Có cách nào tốt hơn để căn chỉnh hành vi đó để các thử nghiệm chỉ thất bại nếu có một "vấn đề thực sự"? Hoặc là mã của tôi chỉ xấu?

+0

đầu ra của thử nghiệm thất bại là gì? '# UserEditForm' gửi đến đâu, nó có phải là ajax không? Nếu nó là, tôi không nghĩ rằng bạn có thể sử dụng ajax với bộ thử nghiệm cơ bản của Laravel, bạn sẽ cần phải sử dụng selen - hãy xem gói này: https://github.com/Modelizer/Selenium – haakym

+0

Nó không phải là AJAX. Đầu ra giống như "dự kiến ​​sẽ thấy John", khi tôi thay đổi tên người dùng từ Alice sang John. Vì vậy, nó đang lấy dữ liệu cũ. Khi tôi tải lại người dùng Auth ::() tất cả đều hoạt động tốt – Alex

+0

Tại sao bạn không sử dụng: '$ this-> type ($ firstName, 'firstname') -> type ($ lastname, 'họ') -> markTestSkipped() -> nhấn ('Save') -> seePageIs ('/ user/profile') -> xem ($ firstName) # ở đây bài kiểm tra thất bại-> xem ($ lastname); '? – user3482682

Trả lời

1

Có thể bạn đang sử dụng update (int $uid) cho yêu cầu?

Giải thích rất có thể là Laravel chỉ sử dụng một cá thể ứng dụng đơn lẻ trong khi thử nghiệm. Nó lấy đầu vào bạn cho nó, xây dựng một đối tượng yêu cầu, và sau đó gửi nó đến phương thức điều khiển. Từ đây, nó có thể hiển thị khung nhìn và kiểm tra xem nó có chứa văn bản của bạn hay không.

Trong việc thực hiện chứng thực một lần bạn gọi Auth::user() nó doest một trong hai điều:

  • Nếu không có người dùng được nạp nó cố gắng lấy nó từ lưu trữ.
  • Nếu người dùng đã được tải, nó sẽ trả về nó.

Phương thức cập nhật của bạn (Tôi đoán) đang truy xuất phiên bản mới của người dùng khỏi lưu trữ và cập nhật nó, chứ không phải bộ nhớ được lưu trong bộ nhớ cache.

Ví dụ:

\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

Nhưng Laravel không nên đặt lại các đối tượng trong các yêu cầu để cung cấp sự cô lập thích hợp? Hoặc là có một cách tốt hơn để viết mã của riêng tôi? – Alex

+1

@alex Tôi sẽ sử dụng một cái gì đó như Codeception để làm loại thử nghiệm thay thế. Mã của bạn là tốt, các Á hậu thử nghiệm là thiếu. – Sturm

Các vấn đề liên quan