设计与发展Rspec:即使在确认后,用户也需要在请求规范中激活帐户

时间:2013-02-10 07:58:35

标签: ruby-on-rails-3 devise capybara rspec2

我的请求规范中包含以下代码:

describe 'Poll' do
    subject { page }

    context 'as system admin' do
        let(:user) { Fabricate(:system_admin) }
            before { login user}

        it 'is accessible' do
            visit '/admin/poll'
            current_path.should == '/admin/poll'
        end

        describe 'sending poll' do

            it 'sends to all users' do
                save_and_open_page
            end
        end
    end
end

即使该方法似乎工作正常,登录用户似乎也不起作用。我尝试在login user块中使用it 'is accessible' do,如果我这样做,那么规格就可以了。如果我从那里删除它并将其放在如上所述的before块中。用户没有保持登录状态。我输入save_and_open_page进行调试,我在页面中收到此通知:

Your account was not activated yet. If a reset password link was sent to you, use that link to change your password.

我正在使用Devise,RSpec,Capybara和Rails 3.我还在我的Fabrication文件中将用户设置为confirm!。以下是它的外观:

Fabricator(:system_admin) do
    first_name { sequence(:first_name) { |n| "Person#{n}"} }
    last_name { sequence(:last_name) {|n| "#{n}" } }
    email { sequence(:email) { |n| "person_#{n}@example.com"} }
    password "foobar"
    password_confirmation "foobar"
    company_name { sequence(:company_name) { |n| "google#{n}" } }
    role "system_admin"

    after_create do |user|
        user.confirm!
      user.create_company
    end
end

问题:可能是什么问题?为什么用户不会保持登录状态?为什么我会收到消息说我应该激活我的帐户? user.confirm!不够吗?

4 个答案:

答案 0 :(得分:0)

这可能是问题吗?

Fabricate(:system_admin)!= Fabricator(:system_admin)

答案 1 :(得分:0)

因此,如果您调试save_and_open_page并且它告诉您该帐户未激活,则表明您的构建工作无法正常运行。你尝试过调试吗?

你的save_and_open_page做了什么?它是否试图将用户用于某事?因为我在使用let定义时,如果没有触及变量(在这种情况下是用户),那么它在该上下文中不存在。除了。当你运行像这样的规格“是不可访问的”时,错误是什么?只是说没有用户登录?

所以你可以存根你的方法进行登录(例如,如果你有一个叫做current_user的方法给你登录的用户或者其他东西)或者不是使用let,那么就像:

user = Fabricate(:system_admin)

但是嘿,这里有很多好的建议:

http://betterspecs.org/

看起来你的块上下文和描述太复杂了。我也没有100%遵循这个指导方针,但我认为我应该这样做,你也会从中受益。

如果您发现其不起作用的另一个原因,请告诉我!

答案 2 :(得分:0)

我认为before(:each)应解决问题

答案 3 :(得分:0)

添加此Devise方法:

confirmed_at { Time.now }

所以你的after_create方法应该是这样的:

  after_create do |user|
      user.confirm!
      user.confirmed_at { Time.now }
      user.create_company
  end