неопределенный метод 'password_confirmation' для пользователя: тестирование Authlogic с Cucumber и Factory Girl - PullRequest
3 голосов
/ 30 сентября 2010

Мои тесты работают нормально, когда я тестирую их по отдельности,

rake cucumber FEATURE = 'path/to/feature'

но когда я пытаюсь запустить

rake cucumber

Они терпят неудачу со следующей ошибкой

undefined method `password_confirmation=' for #<User:0x1069545f0> (NoMethodError)

Это происходит, когда я пытаюсь создать пользователя с помощью Factory.build (: user). У меня есть файл фабрики, который определяет: пользователь.

Я действительно не знаю, как это подтвердить, но как будто authlogic отсутствует, а модель User пока не имеет добавленных методов. Когда я смотрю на методы User (User.new.methods.include? ("Password_confirmation =")) в то время, когда Фабрика пытается создать нового пользователя, существует метод, определенный этим именем.

Я много искал по этому вопросу, и я не вижу ничего связанного, поэтому я предполагаю, что это что-то еще, что я делаю.

EDIT:

Немного больше информации - я смог воспроизвести это в простом случае:

------- .feature

Background:
  Given user "Bad Admin" with email address "badmin@gmail.com" and password "password" exists with "admin" credentials
  Given user "Good Admin" with email address "goodadmin@gmail.com" and password "password" exists with "edit" credentials

Scenario: valid log in with authorization
  When I go to the login page

Scenario: invalid login
  When I go to the login page

---- фабрики.rb

Factory.define :user do |u|
  u.first_name "Arthur"
  u.last_name "Dent"
  u.email { Factory.next(:user_email) }
  u.password "default"
  u.password_confirmation "default"
end

---- steps.rb

Given /^user "([^"]*)" with email "([^"]*)", password "([^"]*)" and credentials "([^"]*)" exists$/ do |name, email, password, role|
  names = name.split(' ')
  user = Factory(:user, :first_name => names.first, :last_name => names.last, :email => email, :password => password, :password_confirmation => password)

  user.has_role! role.downcase.gsub(' ', '_')  
end

1 Ответ

1 голос
/ 30 сентября 2010

Где-то в вашем файле определения шага вы должны активировать Authlogic с помощью before метода шага:

Before do
  include Authlogic::TestCase
  activate_authlogic
end

Фабрика вашего пользователя должна выглядеть так:

Factory.define :user do |f|
  f.sequence(:id) { |n| n }
  f.sequence(:username) { |n| "test#{n}" }
  f.password "secret"
  f.password_confirmation { |u| u.password }
  f.sequence(:email) { |n| "test#{n}@example.com" }
end

Но вам не нужно использовать Factory для создания пользователя. Вот мой сценарий для регистрации и для существующего пользователя:

  Scenario: Successful sign up
    Given I am an anonymous user
    And I am on the home page
    When I follow "Join now!"
    And I fill in "Username" with "test"
    And I fill in "Email" with "test@mail.ru"
    And I fill in "Password" with "secret"
    And I fill in "Confirm Password" with "secret"
    And I press "Create my account"
    Then I should be logged in

  Scenario Outline: Show Sign in or Sign out and Sign Up links
    Given the following user records
      | username | password |
      | test     | secret   |
    Given I am logged in as "<login>" with password "secret"
    When I go to the home page
    Then I should <action 1>
    And I should <action 2>
    Examples:
      | login | action 1       | action 2         |
      | test  | see "Sign out" | see "My Profile" |
      |       | see "Sign in"  | see "Sign up"    |

Фабрика будет использоваться во втором сценарии. Определения соответствующего шага:

Given /^I am an anonymous user$/ do
  !UserSession.find
end

Then /^I should be logged in$/ do
  UserSession.find
end

Given /^the following (.+) records$/ do |factory, table|
  table.hashes.each do |hash|
    Factory(factory, hash)
  end
end

Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |username, password|
  unless username.blank?
    visit signin_url
    fill_in "Username", :with => username
    fill_in "Password", :with => password
    click_button "Sign In"
  end
end
...