1

我是 Rails 的新手。我正在使用 FactoryGirl 为我的集成测试创建用户,但我无法弄清楚如何在测试中登录我的用户。

我的工厂是这样的:

FactoryGirl.define do
    factory :user do
        sequence(:email) { |n| "user#{n}@ticketee.com" }
        password "password"
        password_confirmation "password"
    end

    factory :confirmed_user do
        after_create { |user| user.confirm! }
    end
end

我的测试看起来像这样:

feature 'Editing an exercise' do

    before do
        ex = FactoryGirl.create(:ex)
        user = FactoryGirl.create(:user)
        user.confirm!
        sign_in_as!(user)
    end

    scenario 'can edit an exercise' do
        visit '/'
        click_link 'Exercises'
        click_link 'running'
        click_link 'edit'
        fill_in 'Name', :with => 'kick boxing'
        fill_in 'Description', :with => 'kicking a box'
        click_button 'Save'
        page.should have_content('Exercise updated!')
        page.should have_content('kick boxing')
    end
end

当我运行测试时,我得到了错误:

Failure/Error: sign_in_as!(user)
NoMethodError:
undefined method `sign_in_as!' 
for #<RSpec::Core::ExampleGroup::Nested_1:0xb515ecc>

该应用程序运行良好,只是测试失败。任何帮助,将不胜感激。谢谢!

4

2 回答 2

1

你是对的,我的测试找不到 sign_in_as!,我最终编写了一个如下所示的身份验证助手:

module AuthenticationHelpers
    def sign_in_as!(user)
        visit '/users/sign_in'
        fill_in "Email", :with => user.email
        fill_in "Password", :with => "password"
        click_button "Sign in"
        page.should have_content("Signed in successfully.")
    end
end

RSpec.configure do |c|
    c.include AuthenticationHelpers, :type => :request
end

并将其粘贴在 spec/support/authentication_helpers.rb 中。那行得通。谢谢你的帮助!

于 2013-05-01T00:13:28.550 回答
0

sign_in_as 在哪里!定义?在我看来,它是在 ApplicationController 中定义的,因此在您的测试中不可用。

您可能已经有一个集成测试来登录您的用户,如下所示:

scenario "user logs in" do
  visit '/'
  fill_in "Username", with: "username"
  ...
end

如果是这种情况,您应该能够将大部分代码提取到辅助方法中并在您的 before 块中使用它

编辑:我刚刚发现您可能正在使用 Devise,在这种情况下,您应该像这样编辑您的 spec_helper.rb:

RSpec.configure do |c|
  ...
  c.include Devise::TestHelpers
  ...
end

并使用 sign_in 而不是 sign_in_as!

于 2013-04-30T01:09:08.163 回答