Michael Hartl的Ruby on rails教程 - Rspec测试失败 - 未定义的方法`microposts'

时间:2013-03-29 22:06:29

标签: ruby-on-rails rspec railstutorial.org

所以我在Michael Hartl(伟大的)RoR教程的chapter 11。 在完成第10章之后,我决定将微博表格添加到用户的个人资料页面中,以便您也可以从那里发布,而不仅仅是从主页发布。

我设法让它工作得很好,但它以某种方式崩溃了我的测试套件......

以下是我从Rspec获取的错误消息,对于我的所有User_pages_spec.rb个人资料页面测试:

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

这是我在用户show view中添加的代码:

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

我还将@microposts变量添加到UserController中的show动作:

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

因为一切似乎都很好,在开发和生产中,我不明白为什么我的测试不会通过......他们在我在用​​户个人资料页面中添加了微博表格之后就通过了......

如果有人能解释问题是什么,我将非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

根据您的测试规范,我认为您正在访问user_path但未登录任何用户。因此,在规范执行期间,current_user为nil。你需要像

这样的东西
before do
    sign_in(user)
    visit user_path(user)
end

其中sign_in是一个驻留在spec / utilities.rb中的函数(在我的教程版本中)。它应该在几个章节之前出现。

答案 1 :(得分:0)

我不知道rspec,但是错误消息表明nil没有方法microposts,这意味着用户返回的是nil而不是User的实例。