nil的未定义方法`save':RSpec测试中的NilClass

时间:2014-01-30 07:23:14

标签: ruby-on-rails ruby rspec rspec-rails

我有一个Page资源, pages_controller.rb 文件中的create操作如下所示:

def create
  @page = Page.new(page_params)
    if @page.save
      flash[:notice] = "#{@page.name} was created successfully."
      redirect_to pages_url
    else
      render 'new'    
  end
end

private
  def page_params
    params.require(:page).permit(:name, :content)     
end

pages_controller_spec.rb 文件中的以下测试:

describe PagesController do
  describe "POST Create'" do
    it "creates a new page" do
      Page.should_receive(:new)
      post :create, page: {name: "Foo", content: "Bar"}
    end
  end
end

会产生以下错误:未定义的方法'保存'为nil:NilClass

我刚刚开始使用RSpec;所以我肯定犯了一个错误,或者我忽略了一些简单的事情。另外,我正在关注“RSpec Book”,它继续在page = mock_model(Page).as_null_object之前添加:Page.should...,但我仍然遇到同样的错误。有任何想法吗?谢谢你提前。

2 个答案:

答案 0 :(得分:2)

Page.should_receive(:new)

你基本上是抄袭它。这是简短的:

Page.should_receive(:new).and_return(nil)

这就是为什么你在nil上得到错误的原因:NilClass。您可以做的是链接到and_call_original的调用,如下所示:

Page.should_receive(:new).and_call_original

或者你专门返回一个模拟,类似于:

Page.should_receive(:new).and_return(mock_model(Page))

答案 1 :(得分:0)

你有夹具文件夹中的page.yml可能是因为它没有保存 在我的应用程序中,我添加了蓝色 print.rb是我模型的结构。