Laravelでフォロー機能と通知機能のテストを実装してみた

2021.01.18

見出し画像

最近テスト実装の勉強してます。

以前の記事で実装したフォロー機能、通知機能についてのテストを実装していきます。備忘録的に書いていくので、以前の記事を参考にしてみてください。

実装する内容

フォローについてもしますが、通知もしっかり出来ているかのテストも書きます。(量多くないです)

フォローした時にテーブルのレコード増えてる?

フォロー中のユーザーに追加された?

フォローされたユーザーの通知にレコード追加されてる?

とかです。テストについてはそこまで多くないので1つ1つ解説していきます。

大まかな流れ

テストファイル作成

フォローするとリストに追加される

フォロー済の場合は解除される

自分自身をフォロー出来ない

フォローされたユーザーの通知が追加される

通知を確認した後はレコードの値が変更されている事

自分の投稿に対して自分がコメントしても通知は起きない事(おまけ)

こんな感じで書いていきます。

前提

フォロー機能、通知機能については実装済み、という形で進めて行きます。https://note.com/embed/notes/n104c4a976a28

通知機能についての記事

テストファイル作成

コマンドでファイルを作成します。

php artisan make:test FollowTest

parent::setUp()の設定

use RefreshDatabase;

public function setUp(): void
{
   parent::setUp();
   // テストユーザ作成
   $this->user = factory(User::class)->create();
   $this->another_user = factory(User::class)->create();
   $this->item = factory(Item::class)->create(['user_id' => $this->user->id]);

}

フォローするとリストに追加される

フォローすると自分のフォロー中のユーザーに追加されること、相手のフォロワーリストに追加されることや相手の通知が1つ増えているかなどをテストで確認します。

public function test_フォローするとリストに追加される()
{
   $response = $this->actingAs($this->another_user);
1  $response = $this->get(route('my_page', ['user' => $this->user->id]));
   $response->assertStatus(200);

2  $follow_path = route('follow', ['user' => $this->user->id]);

3  $response = $this->post($follow_path);

   $response->assertSessionHasNoErrors();

4  $this->assertEquals(1, $this->user->followers()->count());
5  $this->assertEquals(1, $this->another_user->follows()->count());

6  $this->assertDatabaseHas('follows', ['following_id' => $this->another_user->id, 'followed_id' => $this->user->id]);

   // フォローされたユーザーの通知が増えている事を確認
7  $this->assertEquals(1, $this->user->unreadNotifications()->count());
}

1,  フォローするユーザーのページに移動します。

2,  コントローラーのフォロー処理をするアクションを動かす為のルーティングパスを設定します。

3,  postメソッドでフォローします。

4,  assertEquals()メソッドを使って自分のフォローリストに追加されているか確認しています。

5,  同じくassertEquals()メソッドを使って、相手のフォロワーリストに自分が追加されているか確認します。

6,  データベースのフォローテーブルにレコードが追加されているか確認している。

7,  最後はフォローした事が相手の通知に追加されているか確認します。

フォロー済の場合は解除される

先程と逆の考え方で既にフォローしている場合はフォローが解除され、フォローリストやフォロワーリストから消えている事を確認していきます。

public function test_フォロー済の場合は解除される()
{
   // フォロー済の状況を作成
   $response = $this->actingAs($this->another_user);
   $response = $this->get(route('my_page', ['user' => $this->user->id]));
   $response->assertStatus(200);
1  $follow_path = route('follow', ['user' => $this->user->id]);
2  $response = $this->post($follow_path);
   $this->assertEquals(1, $this->user->followers()->count());
   $this->assertEquals(1, $this->another_user->follows()->count());

   // フォロー解除
3  $response = $this->post($follow_path);

   // それぞれ値がなくなっている事を確認
4  $this->assertEquals(0, $this->user->followers()->count());
5  $this->assertEquals(0, $this->another_user->follows()->count());

   // データベースにも無い事を確認
6  $this->assertDatabaseMissing('follows', ['following_id' => $this->another_user->id, 'followed_id' => $this->user->id]);

}

1,  フォロー状態を作成します。

2,  コントローラーのアクションに飛びフォロー処理を行います。

3,  もう1度フォロー処理のアクションに飛ばしフォローを解除します。

4,  assertEquals()メソッドでフォローリストに居ないことを確認します。

5,  こちらも同じくassertEquals()メソッドでフォロワーに自分が居ないことを確認します。

6,  データベースのフォローテーブルのレコードも削除されている事を確認します

自分自身をフォロー出来ない

タイトルの通りです。自分をフォローしてもレコードが増えない、リストの中にも追加されないと言ったことを確認します。

public function test_自分自身をフォロー出来ない()
{
1  $response = $this->actingAs($this->user);
   $response = $this->get(route('my_page', ['user' => $this->user->id]));
   $response->assertStatus(200);
2  $follow_path = route('follow', ['user' => $this->user->id]);
3  $response = $this->post($follow_path);

   // フォローしても値が増えない事を確認
4  $this->assertEquals(0, $this->user->followers()->count());
5  $this->assertEquals(0, $this->user->follows()->count());
}

1,  ログイン状態を作ります。

2,  自分自身をフォローする処理を動かすパスを定義します。

3,  フォローする処理を実行します。

4,  assertEquals()メソッドを使用してフォローリストに追加されない事を確認します。

5,  こちらも同じ考えで、フォロワーリストに追加されないことを確認します。

通知テストのファイル作成

php artisan make:test NotificationTest

parent::setUp()の設定

use RefreshDatabase;

public function setUp(): void
{
   parent::setUp();
   // テストユーザ作成
   $this->user = factory(User::class)->create();
   $this->another_user = factory(User::class)->create();
   $this->item = factory(Item::class)->create(['user_id' => $this->user->id]);
   
}

フォローされたユーザーの通知が追加される

ここからは通知側メインのテストになります。

followメソッドを作成します。

public function follow()
{
   // フォロー状態作成
1  $response = $this->actingAs($this->another_user);
2  $response = $this->get(route('my_page', ['user' => $this->user->id]));
   $response->assertStatus(200);
3  $follow_path = route('follow', ['user' => $this->user->id]);
4  $response = $this->post($follow_path);
}

1,  ログイン状態の作成。

2,  ユーザーページへ移動。

3,  フォロー処理のアクションを動かすパスを定義する。

4,  フォロー処理を実行する。

public function test_通知が増える()
{
1  $this->follow();
   // フォローされたユーザーの通知が増えている事を確認
2  $this->assertEquals(1, $this->user->unreadNotifications()->count());

   // レコードを取得
3  $notice_record = $this->user->unreadNotifications()->first();

   // 確認していないので、statusは値がfalseである事を確認
4  $this->assertEquals(false,$notice_record->data['status']);
}

1,  先程作成したfollowメソッドを実行。

2,  フォローされたユーザーの通知テーブルのレコードが増えているか確認する。

3,  通知レコードを取得する。

4,  3で取得したレコードのstatusがfalseになっているか確認します。まだ未確認なのでfalseという事です。

通知を確認した後はレコードの値が変更されている事

自分は通知レコードのstatusの値で未確認か確認を判断しています。実装についてはこちらの記事で紹介しています。

public function test_通知を確認した後はレコードの値が変更されている事()
{
1  $this->follow();

2  $notice_record = $this->user->unreadNotifications()->first();

   // putで送る情報を定義
3  $request_id = [
       'id' => $notice_record->id
   ];

   // 動かすアクションまでのパスを指定
4  $notice_path = route('notice_checked', ['user' => $this->user->id]);

   // putで定義した情報を持って、送信
5  $response = $this->put($notice_path, $request_id);
   $response->assertSessionHasNoErrors();

   // 再度フォローされたユーザーの通知を取得
6  $read_notice = $this->user->unreadNotifications()->first();

   // statusの値がtrueに変更されているか確認
7  $this->assertEquals(true,$read_notice->data['status']);
}

1,  先程作成した、followメソッドを実行します。

2,  通知レコードを取得します。

3,  2で取得したもののidを使って通知を確認する処理をします。そのための情報を設定しています。

4,  コメントアウトのとおりです。

5,  3,4で定義した情報、パスを使ってコントローラーの通知確認処理に飛ばします。

6,  再度通知レコードを取得します。

7,  通知確認後なのでstatusがtrueになっているか確認します。

自分の投稿に対して自分がコメントしても通知は起きない事(おまけ)

こちらの記事でコメント機能について実装しています。

public function test_自分の投稿に対して自分がコメントしても通知は起きない事()
{
   // コメント作成
1  $response = $this->actingAs($this->user);
2  $response = $this->get(route('items.show', ['item' => $this->item->id]));
   $response->assertStatus(200);
3  $commnet = [
       'text' => 'コメントしたいですねー'
   ];
4  $comment_path = route('items.comments.store', ['item' => $this->item->id]);
5  $response = $this->post($comment_path, $commnet);

   // 通知が存在しない事を確認
6  $this->assertEquals(null , $this->user->unreadNotifications()->first());
}

1,  ログイン状態の作成。

2,  詳細ページに移動します。

3,  コメントコントローラーに送る情報を設定します。textの部分はviewで言うところのname属性に当たります。

4,  コメント投稿する処理を動かすパスを定義します。

5,  3,4で定義した保存する情報とパスを使ってコントローラーに飛ばします。

6,  自分の投稿への自分のコメントになるので通知は追加されないことを確認します。

逆に他のユーザーが自分の投稿にコメントした際のテストも書いてあると良いですね。今回は省略してます。

まとめ

assertEquals()メソッドを使う機会が多いので説明を。。シンプルで第一引数と第二引数が同じである事を確認するメソッドです。

assertEquals(期待する値, 調べる値)みたいなイメージですかね。

少しづつテストが書けるようになって来た感じがします。w

今日は一気に街が雪景色に変わりました。冬ですね〜今年はたくさん降って欲しいです🙌

今日はこんな感じで!

以上!