在同一个控制器规范中有很多“get:index”吗?

时间:2014-03-01 17:58:51

标签: ruby-on-rails rspec controller

我想测试一个不同的控制器,无论是登录用户的第一个请求还是后续用户。不同的代码如下:

before_filter :init_guest_user

def init_guest_user
  @guest_user ||= User.find(session[:guest_user_id] ||= create_guest_user.id)

rescue ActiveRecord::RecordNotFound # If session[:guest_user_id] is invalid
  session[:guest_user_id] = nil
  init_guest_user
end

我在我的规范中尝试了以下内容:

it 'finds the guest user for a subsequent request' do
  get :index
  expect {
    get :index
  }.not_to change(User, :count)
end

这很好用。但是以下失败了:

it 'creates a new guest user if the previously existed one vanished' do
  get :index
  User.last.destroy

  expect {
    get :index
  }.to change(User, :count).from(0).to 1
end

看来,@guest_user在两个请求之间仍然存在,这不是我的预期。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

可能是因为@guest_user已经初始化并且没有检查其他条件。我想这会起作用

  def init_guest_user
   @guest_user ||= User.find(session[:guest_user_id] ||= create_guest_user.id)

 rescue ActiveRecord::RecordNotFound # If session[:guest_user_id] is invalid
  session[:guest_user_id] = nil
  @guest_user = nil
  init_guest_user
 end