2016-09-20 117 views
4

嗨我試圖創建一個不依賴於視圖的laravel控制器的測試。我有以下的方法在我的控制器類:在Laravel 5.1上斷言驗證錯誤

public function store(Request $request) 
{ 
    $this->validate($request,[ 
      'name'=>'required', 
      'login'=>'required', 
      'password'=>'required' 
     ]); 
    //TODO: Store to database 
    return redirect('usuario/nuevo'); 
} 

而且我發現下面的代碼來測試請求是否有任何錯誤:

public function testStore() 
{ 
    $response=$this->call('GET','usuario.store'); 
    $this->assertSessionHasErrors(); 
} 

因爲它是這個測試應該通過,因爲我發送無必填字段要求填寫但是PHPUnit的返回以下消息:

Session missing key: errors 
Failed asserting that false is true. 

我可以讓它工作的唯一方法就是嘗試「看」的反應p中的錯誤信息年齡通過使測試,如:

public function testStore() 
{ 
    $this->visit('/usuario/nuevo') 
     ->press('Crear') 
     ->see('Whoops'); 
} 

這並不爲我的工作有兩個原因:1)測試依賴於以「新聞」按鈕,發送請求(我想在測試這個一個不同的測試,並嚴格保持這個控制器)和2)測試取決於'哎呦'字符串存在這顯然是不好的做法。

我發現了幾個答案,聲稱第一個測試代碼應該可以工作,但事實並非如此。

回答

0

你的問題是你沒有測試你認爲你正在測試的東西。

要執行控制器的store(),你應該使用POST方法,而不是GET,除非你的路由真的很奇怪。

+1

哦,是的,我看到現在,不過我已經改變了請求調用POST,仍然得到同樣的結果,我的路線是建立與Laravel的資源方法如下: Route :: resource('usuario','Usuarios \ UsuariosController'); – Dany

1

與會話開始嘗試它,併發送空參數

 $this->startSession(); 
     $this->call('GET','usuario.store', array(
     'name' => '', 
     'login' => '', 
     'password' => '' 
    )); 
    $errors = session('errors'); 
    $this->assertSessionHasErrors(); 
    $this->assertEquals($errors->get('name')[0],""your custom error message);// only for checking exact message