Ruby on rails Rspec测试中的designe认证
我很难让我的Rspec测试在designe试图在before_过滤器中验证用户的项目上正确运行 我遵循了Desive Git wiki中的示例: spec/spec_helper.rb:Ruby on rails Rspec测试中的designe认证,ruby-on-rails,rspec,devise,Ruby On Rails,Rspec,Devise,我很难让我的Rspec测试在designe试图在before_过滤器中验证用户的项目上正确运行 我遵循了Desive Git wiki中的示例: spec/spec_helper.rb: # This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment",
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
end
spec/support/controller_macros.rb:
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
sign_in user
end
end
end
spec/controllers/test.rb:
require 'spec_helper'
describe ProjectsController do
def valid_attributes
{
:name => 'Project',
:description => 'Description'
}
end
def valid_session
{}
end
describe "Test" do
login_user
it "assigns all projects as @projects" do
# test passes if the following line is here, otherwise fails
subject.current_user.should_not be_nil
project = Project.create! valid_attributes
get :index, {}, valid_session
assigns(:projects).should eq([project])
end
end
end
app/controllers/projects_controller.rb(直接来自发电机,添加前置过滤器除外:
class ProjectsController < ApplicationController
before_filter :authenticate_user!
# GET /projects
# GET /projects.json
def index
@projects = Project.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @projects }
end
end
# GET /projects/1
# GET /projects/1.json
def show
@project = Project.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @project }
end
end
# GET /projects/new
# GET /projects/new.json
def new
@project = Project.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @project }
end
end
# GET /projects/1/edit
def edit
@project = Project.find(params[:id])
end
# POST /projects
# POST /projects.json
def create
@project = Project.new(params[:project])
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render json: @project, status: :created, location: @project }
else
format.html { render action: "new" }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
# PUT /projects/1
# PUT /projects/1.json
def update
@project = Project.find(params[:id])
respond_to do |format|
if @project.update_attributes(params[:project])
format.html { redirect_to @project, notice: 'Project was successfully updated.' }
format.json { head :ok }
else
format.html { render action: "edit" }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
# DELETE /projects/1
# DELETE /projects/1.json
def destroy
@project = Project.find(params[:id])
@project.destroy
respond_to do |format|
format.html { redirect_to projects_url }
format.json { head :ok }
end
end
end
class ProjectsController
为什么在包含
subject.current\u user.should\u not nil
的情况下测试通过了,但在未包含的情况下测试失败了?我在下面的过程中遇到了同样的问题。解决方法是从每个请求中删除对有效会话的调用,因为它会覆盖签名设置的会话值呃
它实际上是在同一个操作指南的代码块中记录的,我也错过了:(伙计,你应该赢得一枚奖牌!Wiki链接现在是: