如何在设计rails gem中测试来宾用户?

时间:2013-04-15 10:49:34

标签: ruby-on-rails ruby rspec devise

我想在我的应用程序中使用Devise,我需要访客用户。我尝试使用这个例子 - https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

现在,我想为用户编写一些rspec测试来描述用户成为成员时的行为(这是应用程序控制器中的logging_in操作)。

所以,我的测试现在是这样的:

post :create_guest_user
guest_user = User.find(session[:guest_user_id])
sign_in(guest_user)

guest_user_id = guest_user.id

# Guest user create resume
post = guest_user.posts.build(:title => 'test of guest user')
post.save.should be_true
guest_user.posts.count.should == 1

# Guest user become a member

我不知道,怎么办'#Guest用户成为会员'部分,我想要注意新用户将在注册后创建并且所有帖子都属于他。在应用程序控制器中我有

def logging_in    
guest_user.posts.each do |post|
  post.user = current_user
  post.save
end
end

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您不能与访客用户sign_in。其实我现在不知道为什么,也许是因为它无效。无论如何要以访客身份登录,您需要将其添加到ControllerMacros

module ControllerMacros
  # ...
  def login_guest(guest = false)
    guest ||= FactoryGirl.create(:guest_user)
    @request.env['warden'] = @warden
    @request.session[:guest_user_id] = guest.id
  end
end

工厂:

FactoryGirl.define do
  factory :user do
    ...
  end

  factory :guest_user, class: 'User' do
    sequence(:email)  { Faker::Internet.email }
    role              :guest
    to_create         { |instance| instance.save(validate: false) }
  end
end

用法:

describe PagesController, type: :controller do
  context '#index' do
    before do
      login_guest
      get :index
    end

    it { expect(response).to have_http_status(:success) }
    it { expect(response).to render_template('pages/index') }
  end
end