2015-03-16 19 views
9

Tôi đang kiểm tra xem có đăng nhập thành công hay không. Cho rằng tôi đang kiểm tra,Không kiểm tra đơn vị bộ điều khiển để kiểm tra đăng nhập thành công trong laravel 4.2

  • Nếu đăng nhập thành công
  • Application nên chuyển hướng đến bảng điều khiển

cho rằng controller của tôi trông như thế này

public function loginPost(){ 

    if (Auth::attempt(array(
     'email'  => Input::get('email'), 
     'password' => Input::get('password') 
    ))){ 
     return Redirect::intended(route('dashboard')); 
    } 

    return Redirect::route('login')    
         ->withInput() 
         ->with('errorMessage', 'Failed'); 
} 

test ngoại hình của tôi như thế này

public function testLoginSuccess(){ 
    $input = [ 
     'email'     => '[email protected]', 
     'password'    => 'computer' 
    ]; 

    Input::replace($input); 

    Auth::shouldReceive('attempt') 
      ->with($input) 
      ->once() 
      ->andReturn(true); 

    $this->call('POST', 'login', $input); 

    $this->assertRedirectedToRoute('dashboard'); 
} 

Mặc dù tính năng này hoạt động trong trình duyệt. Nhưng trong khi thử nghiệm, nó không thành công với thông điệp:

BadMethodCallException: Phương pháp Mockery_0_Illuminate_Auth_AuthManager :: séc() không tồn tại trên đối tượng giả này

+0

bạn có thể dán lớp thử nghiệm đầy đủ của bạn – osleonard

+0

@Nirmalz Thapaz trông giống như có điều gì đó tắt về cách bạn đang chế giễu các 'đối tượng Auth' - bạn có thể gửi nơi bạn làm bạn mocking (hoặc toàn bộ tập tin test)? – Leith

+1

Giống như @Leith hỏi, bạn đang chế nhạo đối tượng 'Auth'? [Ngoài ra, Phương thức không tồn tại trên đối tượng giả lập này là giả lập laravel] (https://stackoverflow.com/questions/27747000/method-does-not-exist-on-this-mock-object-laravel-mockery) – joshuamabina

Trả lời

1

Bạn không cho thấy định nghĩa của tuyến đường của bạn, nhưng Tôi giả định tuyến đường login của bạn được bảo vệ bởi guest trước khi lọc. Bộ lọc này sử dụng Auth::check() trước khi gửi đến tuyến đường.

Trong thử nghiệm của bạn, khi bạn gọi Auth::shouldReceive(), làm cho điểm mặt tiền Auth thành một ví dụ giả. Vì bạn không xác định được kỳ vọng trên thể hiện được mô phỏng cho phương thức check(), bạn sẽ gặp lỗi.

Giải pháp đơn giản nhất là tiếp tục và thử phương pháp Auth::check() và yêu cầu trả lại false (để mô phỏng truy cập tuyến đường khi chưa đăng nhập).

public function testLoginSuccess() { 
    $input = [ 
     'email' => '[email protected]', 
     'password' => 'computer' 
    ]; 

    Input::replace($input); 

    // Tell Auth we're not logged in. 
    Auth::shouldReceive('check') 
     ->once() 
     ->andReturn(false); 

    Auth::shouldReceive('attempt') 
     ->with($input) 
     ->once() 
     ->andReturn(true); 

    $this->call('POST', 'login', $input); 

    $this->assertRedirectedToRoute('dashboard'); 
} 

Bạn cũng có thể viết một bài kiểm tra thứ hai với Auth::check() chế giễu để trở true để kiểm tra những gì xảy ra khi bạn truy cập đường đăng nhập của bạn khi đã đăng nhập.

1

Theo tôi, đây là một thử nghiệm chức năng không phải là một bài kiểm tra đơn vị. Có hoàn toàn không cần cho bạn tiếp tục các lớp học chế nhạo. Bạn cần phải viết một bài kiểm tra chức năng cho việc này.

Nếu tôi đã phải làm điều đó, tôi sẽ làm một cái gì đó như thế này: yêu cầu bài

  • Send to login tuyến đường với Tên truy nhập, mật khẩu, csrf_token, vv
  • Khẳng định trang đó được chuyển hướng đến một liên kết giả : http://localhost/home

Vì vậy, mã thử nghiệm của bạn trong Laravel 4.2 sẽ là một cái gì đó như thế này:

// Update the following code accordingly for your app. 

    $credentials = array(
     'email'  => '[email protected]', 
     'password' => 'johndoe', 
     'csrf_token' => csrf_token() 
    ); 

    $this->withInput($credentials) 
     ->requestAction('POST', '[email protected]'); 

    $this->assertRedirection(URL::action('[email protected]')); 
0

Có lẽ, điều này stackoverflow thread có thể giúp đỡ.


Là một sang một bên: Tôi đồng ý với @Raza Mehdi.

Tôi nghĩ thử nghiệm chức năng đăng nhập từ cấp cao, kiểm tra mã thực tế của chúng tôi, thay vì chế nhạo đối tượng Auth (loại chúng tôi không sở hữu).

  • Gọi tuyến đăng nhập, chuyển thông tin xác thực người dùng.
  • Xác nhận rằng trạng thái là OK.
  • Xác nhận rằng người dùng được chuyển hướng đến trang tổng quan.

Trong mã:

$input = [...]; 

$this->call('POST', 'login', $input); 

$this->assertResponseStatus(200); 

$this->assertRedirectedToRoute('dashboard'); 
Các vấn đề liên quan