2014-03-18 5 views
1

내 응용 프로그램의 단위 테스트를 작성하려고하는데 예를 들어 GET 요청을 테스트하는 방법을 알고 있다고 생각합니다. 컨트롤러 I 테스트가 도착하도록되어 다음과 같은 기능을 가지고 나는 또한이이 경로에서 참조Laravel 4 - 단위 테스트

public function getCreate() { 
    return View::make('account.create'); 
} 

/* 
Create account (GET) 
*/ 
Route::get('/account/create', array(
    'as' => 'account-create', 
    'uses' => '[email protected]' 
)); 

것과 같은 파일 '계정보기를 만들'I 테스트를 위해 다음과 같이 나타납니다.

public function testGetAccountCreate() 
{ 
    $response = $this->call('GET', '/account/create'); 

    $this->assertTrue($response->isOk()); 

    $this->assertResponseOk(); 
} 

이제이 테스트는 통과하지만 POST 요청을 테스트하려면 어떻게해야합니까? 내가 테스트 할 포스트 기능은 다음이 또한 경로에서 참조

public function postCreate() { 
    $validator = Validator::make(Input::all(), 
     array(
      'email'   => 'required|max:50|email|unique:users', 
      'username'  => 'required|max:20|min:3|unique:users', 
      'password'  => 'required|min:6', 
      'password_again' => 'required|same:password' 
     ) 
    ); 

    if ($validator->fails()) { 
     return Redirect::route('account-create') 
       ->withErrors($validator) 
       ->withInput(); 
    } else { 

     $email = Input::get('email'); 
     $username = Input::get('username'); 
     $password = Input::get('password'); 

     // Activation code 
     $code  = str_random(60); 

     $user = User::create(array(
      'email' => $email, 
      'username' => $username, 
      'password' => Hash::make($password), 
      'password_temp' => '', 
      'code' => $code, 
      'active' => 0 
     )); 

     if($user) { 

      Mail::send('emails.auth.activate', array('link' => URL::route('account-activate', $code), 'username' => $username), function($message) use ($user) { 
       $message->to($user->email, $user->username)->subject('Activate your account'); 
      }); 

      return Redirect::route('account-sign-in') 
        ->with('global', 'Your account has been created! We have sent you an email to activate your account.'); 
     } 
    } 
} 

이 같은 파일 : 나는 다음과 같은 시험을하지만 성공을 쓰기 위해 노력했다

/* 
    Create account (POST) 
    */ 
    Route::post('/account/create', array(
     'as' => 'account-create-post', 
     'uses' => '[email protected]' 
)); 

. 나는 무엇이 잘못되고 있는지 확신하지 못한다. 나는 이것이 데이터를 필요로하고 올바르게 전달하지 못하기 때문에 생각한다. 단위 테스트를 시작하는 어떤 단서, 감사하겠습니다. 당신은 실제로 어떤 성공처럼 보이는없는 것을 말했다하지 않은

There was 1 failure: 

1) AssetControllerTest::testPostAccountCreate 
Session missing key: email 
Failed asserting that false is true. 

/www/assetlibr/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:271 
/www/assetlibr/app/tests/controllers/AssetControllerTest.php:23 

답변

3

경로 필터와 세션이 설정 기능에서 활성화되어 있는지 확인합니다 :

public function setUp() 
{ 
    parent::setUp(); 

    Session::start(); 

    // Enable filters 
    Route::enableFilters(); 
} 

일예 테스트 로그인 :

public function testShouldDoLogin() 
{ 
// provide post input 

$credentials = array(
     'email'=>'admin', 
     'password'=>'admin', 
     'csrf_token' => csrf_token() 
); 

$response = $this->action('POST', '[email protected]', null, $credentials); 

// if success user should be redirected to homepage 
$this->assertRedirectedTo('/'); 
} 
+0

수정하여 감사했습니다! 하지만 나에게 오류를 줄 것이기 때문에 나는 setup 함수를 포함하지 않았다. 오류는 내 테스트를 파괴하고 실행하지 못할거야 – cch

3

하지만 당신의 주장이 실패하는 것이 있다면 코드가 아무튼 때문에, 그 다음은 다음과 같습니다

public function testPostAccountCreate() 
{ 
$response = $this->call('POST', '/account/create'); 
$this->assertSessionHas('email'); 
$this->assertSessionHas('username'); 
$this->assertSessionHas('email'); 
} 

테스트의 출력은 세션에 데이터를 두지 않으므로 게시물 요청과 함께 데이터를 전달하는 경우에도 이러한 어설 션이 실패합니다. 나는 적절한 결과가 즉 당신이 테스트하는 것이 좋습니다 것

public function testPost() 
{ 
    $this->call('POST', 'account/create', ['email' => '[email protected]']); 

    $this->assertResponseOk(); 

    $this->assertEquals('[email protected]', Input::get('email')); 
} 

실제로 불구하고 :

는이처럼() 메서드 호출에 뭔가를 세 번째 매개 변수를 추가 할 데이터를 전달합니다. 전달 된 데이터를 검사하기보다는 입력 데이터에 따라 전송 된 메일 및 리다이렉트.

+0

감사합니다. 테스트 결과를 포함하지 않아서 유감입니다. 포함되어 있습니다. – cch

+0

그게 유용하고 내가 의심 스러웠던 것, 즉 테스트가 세션에서 데이터를 찾는다는 것입니다. 세션에 데이터를 넣으려고하지 않는 한 테스트가 데이터를 찾지 않을 것이기 때문입니다. – petercoles