我正在使用Ruby on Rails 3.2.2,Rspec 2.9.0和RspecRails 2.9.0。我正在尝试测试一个new
控制器操作,我想知道为什么我只是为了这个操作而得到上面解释的错误。
假设:
# controller
class ArticlesController < ApplicationController
before_filter :signed_in
def new
@article = Article.new
# This is just a sample code line to show you where the error happens?
@article.new_record?
...
end
def show
@article = Article.find(params[:id])
...
end
end
# spec file
require 'spec_helper'
describe ArticlesController do
before(:each) do
@current_user = FactoryGirl.create(:user)
# Signs in user so to pass the 'before_filter'
cookies.signed[:current_user_id] = {:value => [@current_user.id, ...]}
end
it "article should be new" do
article = Article.should_receive(:new).and_return(Article.new)
get :new
assigns[:article].should eq(article)
end
it "article should be shown" do
article = FactoryGirl.create(:article)
get :show, :id => article.id.to_s
assigns[:article].should eq(article)
end
end
当我运行与new
操作相关的示例时,我收到此错误(它与控制器文件中的@article.new_record?
代码行有关):
Failure/Error: get :new
NoMethodError:
undefined method `new_record?' for nil:NilClass
但是当我运行与show
动作相关的示例时,它会毫无错误地通过。
有什么问题?我该如何解决?
答案 0 :(得分:2)
问题在于你已经完成的方式
Article.should_receive(:new).and_return(Article.new)
这与
相同temp = Article.should_receive(:new)
temp.and_return(Article.new)
因此,当您设置返回值时,Article.new
已经被模拟掉,因此返回nil,因此您正在执行and_return(nil)
首先创建返回值,即
new_article = Article.new #or any other way of creating an article - it may also be appropriate to return a mock
Article.should_receive(:new).and_return(new_article)
答案 1 :(得分:1)
尝试:
it "article should be new" do
article = FactoryGirl.build(:article)
Article.stub(:new).and_return(article)
get :new
assigns(:article).should == article
end