자습서 14장 사용자 팔로우 - 상태 피드 구현 동기 및 계획(데이터 모델 설명 및 테스트 구현)

상태 피드 데이터 모델의 기본



예를 들어, "id 1의 사용자가 id 2, 7, 8, 10의 사용자를 팔로우하고 있다"라고 하는 경우, 피드의 데이터 모델은, microposts 테이블의 샘플 데이터와 세트로 나타내면 다음과 같은 이미지가 됩니다.



위의 화살표는 "현재 사용자 자신과 현재 사용자가 팔로우하는 사용자에 해당하는 사용자 ID를 가진 마이크로 포스트를 검색합니다"라는 작업을 나타냅니다.

상태 피드 요구 사양 및 이에 대한 테스트



상태 피드 요청 사양



어떻게 구현할 것인지를 알아두고,이 시점에서 상태 피드의 요청 사양으로 다음을 나타낼 수 있습니다.
  • 로그인 사용자 자신의 마이크로 포스트가 상태 피드에 포함되어 있는지
  • 팔로우하는 사용자의 마이크로 포스트가 상태 피드에 포함되어 있는지
  • 팔로우하지 않은 사용자의 마이크로 포스트가 상태 피드에 포함되어 있지 않음

  • 위의 요구 사양을 어설션으로 확장하여 테스트를 구현해 봅시다.

    '상태 피드 표시'라는 기능의 구현 위치



    "상태 피드 표시"라는 기능은 User 모델에 feed 메서드로 구현했기 때문입니다. 다음은 현재 app/models/user.rb#feed의 내용을 보여줍니다.

    app/models/user.rb#feed
    class User < ApplicationRecord
      has_many :microposts, dependent: :destroy
      # ...略
      def feed
        Micropost.where("user_id = ?", id)
      end
      #...略
    end
    

    상태 피드 테스트 구현



    전제 조건으로 다음 fixture가 있다고 가정합니다.

    test/fixtures/relationships.yml
    one:
      follower: rhakurei
      followed: skomeiji
    
    two:
      follower: rhakurei
      followed: rusami
    
    three:
      follower: skomeiji
      followed: rhakurei
    
    four:
      follower: mkirisame
      followed: rhakurei
    

    위의 fixture에서 다음과 같은 관계가 있음을 알 수 있습니다.
  • rhakurei가 rusami를 따르고 있습니다
  • rhakurei가 mkirisame를 팔로우하지 않습니다

  • 이 상황에서는, 「rhakurei의 스테이터스 피드에는, rusami와 rhakurei의 마이크로 포스트는 보이지만, mkirisame의 마이크로 포스트는 보이지 않는다」라고 하는 것이 요구 사양대로의 실장이 됩니다.

    테스트 대상은 User 모델이므로 테스트 구현 위치는 test/models/user_test.rb입니다. 다음은 실제 테스트의 구현 내용입니다.

    test/models/user_test.rb
    require 'test_helper'
    
    class UserTest < ActiveSupport::TestCase
    
      #...略
    
      test "feed should have the right posts" do
        rhakurei  = users(:rhakurei)
        mkirisame = users(:mkirisame)
        rusami  = users(:rusami)
        # フォローしているユーザーの投稿を確認
        rusami.microposts.each do |post_following|
          assert rhakurei.feed.include?(post_following)
        end
        # 自分自身の投稿を確認
        rhakurei.microposts.each do |post_self|
          assert rhakurei.feed.include?(post_self)
        end
        # フォローしていないユーザーの投稿を確認
        mkirisame.microposts.each do |post_unfollowed|
          assert_not rhakurei.feed.include?(post_unfollowed)
        end
      end
    end
    

    상태 피드 테스트 구현에 대한 마이크로 포스트 fixture 참고 사항



    ※상기 테스트 「feed should have the right posts」에서 사용하는 모든 유저에 대해서, 1개 이상의 마이크로 포스트를 test/fixtures/microposts.yml 로 정의해 둘 필요가 있습니다. 마이크로포스트를 정의하지 않은 사용자가 테스트 "feed should have the right posts"에 포함되어 있으면 테스트 "feed should have the right posts"가 제대로 작동하지 않습니다.

    해당 테스트를 처음 구현한 시점에서 상태 피드 테스트의 동작 결과



    현재 test/models/user_test.rb에 대한 테스트 결과는 다음과 같습니다.
    # rails test test/models/user_test.rb
    Running via Spring preloader in process 127
    Started with run options --seed 63017
    
     FAIL["test_feed_should_have_the_right_posts", UserTest, 3.487605000000258]
     test_feed_should_have_the_right_posts#UserTest (3.49s)
            Expected false to be truthy.
            test/models/user_test.rb:103:in `block (2 levels) in <class:UserTest>'
            test/models/user_test.rb:102:in `block in <class:UserTest>'
    
      15/15: [=================================] 100% Time: 00:00:04, Time: 00:00:04
    
    Finished in 4.55564s
    15 tests, 27 assertions, 1 failures, 0 errors, 0 skips
    

    테스트는 다음 코드로 실패했습니다.

    test/models/user_test.rb(102-104행)
    rusami.microposts.each do |post_following|
      assert rhakurei.feed.include?(post_following)
    end
    

    「로그인 유저 자신과는 다른, 팔로우 하고 있는 유저의 마이크로 포스트가 피드에 표시되어 있지 않다」라고 하는 이유로 테스트가 떨어지고 있다, 라고 하는 것이군요.

    좋은 웹페이지 즐겨찾기