2017-08-30 8 views
2

私はコントローラーPostに典型的なCRUDメソッドを持っています。 は、私はここで、PostPolicyを持っている:Laravelで不正な方法をテストするにはどうすればよいですか?

public function destroy(User $user, Post $post) 
{ 
    $user->id === $post->author_id; 
} 

私はこのためにテストを書きたいです。ユーザーが自分の投稿を削除するかどうかを確認すると、すべてOKになります。

しかし、ときに、他のユーザー、ユーザーが自分のポスト、laravelテスト送信エラーがない削除することができれば、私はテスト:

Illuminate\Auth\Access\AuthorizationException: This action is unauthorized. 

どのようにそれをバイパスしたり、書き込みのための別の方法このテストを持っていますか?

あなたは、あなたのテストメソッドの先頭に以下を追加することができ

<?php 

namespace Tests\Feature; 

use Tests\TestCase; 
use App\Models\Feeds\Feed; 
use App\Models\User; 
use Tests\SphinxConnection; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 
class PolicyTest extends TestCase 
{ 
    use DatabaseMigrations, 
     SphinxConnection; 

    public function testFeedPolicy() 
    { 
     $this->expectException(\Illuminate\Auth\Access\AuthorizationException::class); 

     $user1 = factory(User::class)->create([ 
      'id' => 1, 
     ]); 
     $user2 = factory(User::class)->create([ 
      'id' => 2, 
     ]); 

     factory(Post::class)->create([ 
      'id' => 27, 
      'editor_id' => 2, 
     ]); 
     factory(Post::class)->create([ 
      'id' => 30, 
      'editor_id' => 2, 
     ]); 

     $this->delete('/api/feeds/27', [], [ 
      'authorization' => "Bearer {$user2->api_token}", 
      'accept' => 'application/json', 
     ])->assertJson([ 

     ]);; 
     $this->delete('/api/feeds/30', [], [ 
      'authorization' => "Bearer {$user1->api_token}", 
      'accept' => 'application/json', 
     ])->assertJson([ 

     ]);; 
    } 
} 
+0

テストのコードを表示できますか? –

+0

更新ポスト.... – yrrtyrt

+0

どのバージョンのLaravel 5をお使いですか? –

答えて

0

コード:

$this->expectException(\Illuminate\Auth\Access\AuthorizationException::class); 

EDIT

のようになりますあなたの試験方法:

/** @test */ 
function a_user_can_delete_their_own_post() 
{ 
    $user = factory(User::class)->create(); 

    $post = factory(Post::class)->create([ 
     'editor_id' => $user->id, 
    ]); 

    $this->actingAs($user); 

    $this 
     ->delete("/api/feeds/{$post->id}", [], [ 
      'authorization' => "Bearer {$user->api_token}", 
      'accept'  => 'application/json', 
     ]) 
     ->assertResponseOk(); 

    $this->assertFalse(Post::where('id', $post->id)->exists()); 
} 

/** @test */ 
function a_user_can_not_delete_a_post_they_do_not_own() 
{ 
    $this->expectException(\Illuminate\Auth\Access\AuthorizationException::class); 

    $user = factory(User::class)->create(); 

    $post = factory(Post::class)->create([ 
     'editor_id' => $user->id + 1, 
    ]); 

    $this->actingAs($user); 

    $this->delete("/api/feeds/{$post->id}", [], [ 
     'authorization' => "Bearer {$user->api_token}", 
     'accept'  => 'application/json', 
    ]); 
} 

これが役立ちますように!

+0

テストは常に完了し、ユーザーが投稿を削除することはできません。 – yrrtyrt

+0

あなたが書いた文字列を追加すると、いつもOKなので、結果は期待しませんでした。 – yrrtyrt

+0

@yrrtyrtユーザーが投稿を削除できることと、別のユーザーが同じ方法(機能)で投稿を削除できないことをテストしていますか? –

関連する問題