2016-01-13 29 views
3

我正在測試一個表單,用戶必須介紹一些文本,比如說100和500個字符。更好的方法來測試驗證錯誤

我使用模擬用戶輸入:

$this->actingAs($user) 
->visit('myweb/create') 
->type($this->faker->text(1000),'description') 
->press('Save') 
->see('greater than'); 

在這裏,我正在尋找在響應中greater than一段文字......這取決於該驗證錯誤中指定的翻譯。

如何在不依賴驗證錯誤的文本的情況下進行相同的測試,並僅依賴於錯誤本身?

控制器:

public function store(Request $request) 
{ 
    $success = doStuff($request); 
    if($success) 
    { 
     Flash::success('Created'); 
    }else{ 
     Flash::error('Fail'); 
    } 

    return Redirect::back(): 
} 

DD(會話::所有()):

`array:3 [ 
    "_token" => "ONoTlU2w7Ii2Npbr27dH5WSXolw6qpQncavQn72e" 
    "_sf2_meta" => array:3 [ 
    "u" => 1453141086 
    "c" => 1453141086 
    "l" => "0" 
    ] 
    "flash" => array:2 [ 
    "old" => [] 
    "new" => [] 
    ] 
] 

回答

1

你能做到這一點,像這樣 -

$this->assertSessionHas('flash_notification.level', 'danger');,如果你正在尋找一個特定的錯誤或成功的關鍵。

或使用 $this->assertSessionHasErrors();

+0

不能使用,即使我真的得到驗證錯誤工作。 assertSessionHasErrors()驗證爲false。 '會話丟失鍵:錯誤 失敗斷言錯誤爲真。 ' – vivoconunxino

+0

發佈您的控制器代碼 –

+0

可能與laravel 5.1相關,而不是我的控制器,請查看:https://laracasts.com/discuss/channels/testing/session-missing-key-in-phpunit – vivoconunxino

0

您的測試沒有後調用。下面是使用一個例子Jeffery Way's flash package

控制器:

public function store(Request $request, Post $post) 
{ 
    $post->fill($request->all()); 
    $post->user_id = $request->user()->id; 

    $created = false; 

    try { 
     $created = $post->save(); 
    } catch (ValidationException $e) { 
     flash()->error($e->getErrors()->all()); 
    } 

    if ($created) { 
     flash()->success('New post has been created.'); 
    } 

    return back(); 
} 

測試:

public function testStoreSuccess() 
{ 
    $data = [ 
     'title' => 'A dog is fit', 
     'status' => 'active', 
     'excerpt' => 'Farm dog', 
     'content' => 'blah blah blah', 
    ]; 

    $this->call('POST', 'post', $data); 

    $this->assertTrue(Post::where($data)->exists()); 
    $this->assertResponseStatus(302); 
    $this->assertSessionHas('flash_notification.level', 'success'); 
    $this->assertSessionHas('flash_notification.message', 'New post has been created.'); 
} 
+0

按保存按鈕(' - >按('保存')')也應該發送一個請求。順便說一句,嘗試你的,但現在斷言失敗,因爲令牌:'testing.ERROR:例外'Illuminate \ Session \ TokenMismatchException'/var/www/html/anuncios.com/vendor/laravel/framework/src/Illuminate/Foundation/Http /Middleware/VerifyCsrfToken.php:53' – vivoconunxino

+0

添加這些特性... DatabaseTransactions,WithoutMiddleware到您的測試類。 –

+0

好的,(我也可以'做$ this->是($ some_user);')。儘管如此,斷言失敗,沒有引發任何Flash消息,我在發佈後使​​用會話的var_dump更新了問題。可能是因爲錯誤是由FormRequest傳遞的,而不是專門調用Flash Facade? ' – vivoconunxino

0

從會議誤差修改得到MessageBag對象並使用得到的所有驗證錯誤的名字$errors->get('name')

$errors = session('errors'); 
    $this->assertSessionHasErrors(); 
    $this->assertEquals($errors->get('name')[0],"The title field is required."); 

這適用於Laravel 5 +

1

我認爲有更清晰的方法可以從會話中獲得確切的錯誤消息。

/** @var ViewErrorBag $errors */ 
    $errors = request()->session()->get('errors'); 
    /** @var array $messages */ 
    $messages = $errors->getBag('default')->getMessages(); 
    $emailErrorMessage = array_shift($messages['email']); 

    $this->assertEquals('Already in use', $emailErrorMessage); 

Pre-requirements: code was tested on Laravel Framework 5.5.14

相關問題