在编写请求规范时,如何设置会话和/或存根控制器方法?我正在尝试在我的集成测试中删除身份验证 - rspec/requests
这是一个测试的例子
require File.dirname(__FILE__) + '/../spec_helper'
require File.dirname(__FILE__) + '/authentication_helpers'
describe "Messages" do
include AuthenticationHelpers
describe "GET admin/messages" do
before(:each) do
@current_user = Factory :super_admin
login(@current_user)
end
it "displays received messages" do
sender = Factory :jonas
direct_message = Message.new(:sender_id => sender.id, :subject => "Message system.", :content => "content", :receiver_ids => [@current_user.id])
direct_message.save
get admin_messages_path
response.body.should include(direct_message.subject)
end
end
end
Run Code Online (Sandbox Code Playgroud)
帮助者:
module AuthenticationHelpers
def login(user)
session[:user_id] = user.id # session is nil
#controller.stub!(:current_user).and_return(user) # controller is nil
end
end …Run Code Online (Sandbox Code Playgroud) 在尝试测试某些登录/注销功能时,我想从会话中删除一些信息.我发现我根本无法访问会话.我一直得到错误:nil的未定义方法`session':NilClass.
但令我惊讶的是,我发现我可以从其他rspec页面访问会话.其他详细信息如下.我的问题是:为什么我可以从某些文件而不是其他文件访问会话?我怎样才能在下面的第二个例子中访问会话?
详细信息文件:spec/controllers/tenants_controller_spec.rb
require 'spec_helper'
describe TenantsController do
specify { session[:tag].should == 'abc' }
end
Run Code Online (Sandbox Code Playgroud)
文件:spec/requests/test.rb
require 'spec_helper'
describe 'Test' do
specify { session[:tag].should == 'abc' }
end
Run Code Online (Sandbox Code Playgroud)
当我通过rspec运行第一个文件时,我得到:
Failure/Error: specify { session[:tag].should == 'abc' }
expected: "abc"
got: nil (using ==)
Run Code Online (Sandbox Code Playgroud)
这很好.这应该是失败的原因.
但是,当我运行第二个文件时,我得到:
Failure/Error: specify { session[:tag].should == 'abc' }
NoMethodError:
undefined method `session' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
那么为什么会话是一个未定义的方法呢?