0

それで、私はMichael Hartl の (素晴らしい) RoR チュートリアルの第 11 章にいます。第 10 章を終えた後、ユーザーのプロフィール ページにマイクロポストを追加して、ホームページだけでなくそこからも投稿できるようにすることにしました。

なんとかうまく動作させましたが、どういうわけかテストスイートがクラッシュします...

User_pages_spec.rb プロファイル ページのすべてのテストで、Rspec から取得したエラー メッセージは次のとおりです。

UserPages profile page 
     Failure/Error: before { visit user_path(user) }
     NoMethodError:
       undefined method `microposts' for nil:NilClass
     # ./app/controllers/users_controller.rb:17:in `show'
     # ./spec/requests/user_pages_spec.rb:60:in `block (3 levels) in <top (required)>'

ここに私のテストファイルがあります:

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
    let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }

    before { visit user_path(user) }

    it { should have_selector('h1', text: user.name) }
    it { should have_selector('title', text: user.name) }

    describe "microposts" do
      it { should have_content(m1.content) }
      it { should have_content(m2.content) }
      it { should have_content(user.microposts.count) }
    end
  end

ユーザーモデルにマイクロポストメソッドがあります:

has_many :microposts, dependent: :destroy

ユーザー表示ビューに追加したコードは次のとおりです。

    <% if current_user?(@user) %>
      <section>
        <%= render 'shared/micropost_form' %>
      </section>
    <% end %>

また、UserController の show アクションに @microposts 変数を追加しました。

def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
    @micropost = current_user.microposts.build
end

すべてがうまくいっているように見えるので、開発と本番環境で、なぜ私のテストが通らないのか理解できません... ユーザープロファイルページにマイクロポストフォームを追加する前に、テストは通っていました...

誰かが問題を説明できる場合は、助けていただければ幸いです。

4

2 に答える 2

1

あなたのテスト仕様から、あなたは user_path にアクセスしていると思いますが、どのユーザーもサインインしていません。結果として、spec の実行中は current_user は nil になります。次のようなものが必要です

before do
    sign_in(user)
    visit user_path(user)
end

wheresign_inは (私のバージョンのチュートリアルでは) spec/utilities.rb にある関数です。数章前からあるはずです。

于 2013-03-30T00:29:28.200 に答える
0

rspec はわかりませんが、エラー メッセージは、nil にメソッド microposts がないことを示しています。つまり、user が User のインスタンスではなく nil を返していることを意味します。

于 2013-03-29T22:19:03.100 に答える