Ruby on rails 3 设计及;Rspec:即使在确认后,用户仍需要在requests spec中激活帐户

Ruby on rails 3 设计及;Rspec:即使在确认后,用户仍需要在requests spec中激活帐户,ruby-on-rails-3,devise,capybara,rspec2,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' curren

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

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
登录用户似乎不工作,即使该方法似乎工作正常。我试着在
it'isaccessible'do
块中使用
login user
,如果我这样做的话,说明工作正常。如果我将其从那里移除,并将其放入上面的
块之前的
。用户未保持登录状态。我在
save_和_open_页面
中加入了调试,我在页面中收到了以下通知:

Your account was not activated yet. If a reset password link was sent to you, use that link to change your password.
我使用的是Desive、RSpec、Capybara和Rails 3。我还将用户设置为
确认在我的制作文件中。下面是它的外观:

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够了吗

这就是问题所在吗


制作(:系统管理员)!=制造商(:system\u admin)

因此,如果您调试保存和打开页面,并且它告诉您帐户未激活,则表明您的制造商工作不正常。你试过并调试过吗

保存和打开页面的作用是什么?它是否尝试将用户用于某些用途?因为我在使用let定义时经历过,如果没有触及变量(在本例中为用户),那么它在该上下文中就不存在。此外当你在上面运行这样的规格时,有什么错误“是不可能的”?只是说没有用户登录

因此,您可以存根您的登录方法(例如,如果您有一个名为current_user的方法,该方法为您提供登录用户或其他信息),或者不使用let,而是像这样灌输:

用户=制造(:系统\管理)

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

您的块上下文和描述似乎太复杂了。我也不是百分之百地遵循这个指导原则,但我认为我应该这样做,你也会从中受益


如果你发现它不起作用的另一个原因,请告诉我

我认为
之前(:each)
应该解决问题

添加此设计方法:

confirmed_at { Time.now }
因此,您的创建后方法应该如下所示:

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