我根据Hartl的Rails教程创建了我的身份验证系统,并且遇到了控制器测试问题。
engagements_controller_spec.rb
require 'spec_helper'
describe EngagementsController do
describe "GET show" do
let(:user) { FactoryGirl.create(:user) }
before { sign_in user }
it "assigns requested engagement to @engagement" do
engagement = FactoryGirl.create(:engagement, user: user)
get :show, id: engagement
assigns[:engagement].should eq(engagement)
end
it "renders :show" do
engagement = FactoryGirl.create(:engagement, user: user)
get :show, :id => engagement.id
expect(response).to render_template("show")
end
end
end
我得到的错误:
EngagementsController GET show renders :show
Failure/Error: expect(response).to render_template("show")
expecting <"show"> but rendering with <[]>
# ./spec/controllers/engagements_controller_spec.rb:37:in `block (3 levels) in < top (required)>'
EngagementsController GET show assigns requested engagement to @engagement
Failure/Error: assigns[:engagement].should eq(engagement)
expected: #<Engagement id: 42, title: "Coding", content: "Got in the zone with coding", user_id: 46, created_at: "2014-08-28 21:08:43", updated_at: "2014-08-28 21:08:43", photo_file_name: nil, photo_content_type: nil, photo_file_size: nil, photo_updated_at: nil>
got: nil
(compared using ==)
# ./spec/controllers/engagements_controller_spec.rb:31:in `block (3 levels) in < top (required)>'
engagements_controller.rb
class EngagementsController < ApplicationController
before_action :signed_in_user
before_action :correct_user, only: [:show]
def show
@engagement = Engagement.find(params[:id])
end
private
def correct_user
@engagement = current_user.engagements.find_by_id(params[:id])
if @engagement.nil? && !current_user.try(:admin)
redirect_to root_url
end
end
我已经尝试过每一个没有运气的答案。非常感谢任何帮助!
答案 0 :(得分:1)
我想出了答案。在控制器之前,我有:
before { sign_in user }
但是,在控制器规范中,应禁用Capybara。因此,使用:
before { sign_in user, no_capybara: true }
让它发挥作用。
我理解为什么会这样,但还不足以解释它。如果有人有一个很好的解释,那就太棒了! :)