【问题标题】:Undefined method `save' for nil:NilClass in RSpec testRSpec 测试中 nil:NilClass 的未定义方法“保存”
【发布时间】:2014-01-30 07:23:14
【问题描述】:

我有一个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

这会产生以下错误:undefined method 'save' for nil:NilClass

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

【问题讨论】:

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


    【解决方案1】:

    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))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多