我有一个rspec测试,我需要测试我的控制器。
it "renders the #show view" do
get :show, id: FactoryGirl.create(:quiz)
@facebook_profile = FactoryGirl.create(:facebook_profile)
response.should render_template :show
end
facebook_profile对象有一个user_q1列,因此@ facebook_profile.user_q1给出了有效的结果。
在我的测验控制器中:
@user_q1 = @facebook_profile.user_q1
这在手动测试中工作正常,但在rspec中,我得到了结果:
undefined method `user_q1' for nil:NilClass
我怀疑问题出现在控制器的show方法的第一行:
@facebook_profile = FacebookProfile.find_by_facebook_id(session[:facebook_profile_id])
我的会话控制器中有一个变量(虽然不是任何模型中的列)我称之为facebook_profile_id。然后我在我的测验控制器的上面代码行中调用这个变量。我认为我的规范无法定义@facebook_profile,因为它不知道facebook_profile_id。显然只是定义" @facebook_profile = FactoryGirl" (就像我上面一样)不起作用。
答案 0 :(得分:1)
你应该这样做:
let(:fb_profile) { FactoryGirl.create(:facebook_profile) }
let(:quiz) { FactoryGirl.create(:quiz) )
it "renders the #show view" do
FacebookProfile.should_receive(:find_by_facebook_id).and_return fb_profile
get :show, id: quiz.id
response.should render_template :show
end
实际上你不需要在db中创建对象,但这是另一个争论。