2010-09-30 4 views
3

Mes tests fonctionnent bien quand je les tester individuellement,méthode non définie 'password_confirmation' pour l'utilisateur: Test Authlogic avec concombre et Factory Girl

rake cucumber FEATURE = 'path/to/feature' 

mais quand je tente d'exécuter

rake cucumber 

Ils échouent avec l'erreur suivante

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

Cela apparaît lorsque j'essaie de créer un utilisateur à l'aide de Factory.build (:utilisateur). J'ai un fichier d'usines qui définit un: utilisateur.

Je ne sais pas vraiment comment confirmer cela, mais c'est comme si authlogic n'est pas présent et le modèle utilisateur n'a pas encore les méthodes ajoutées. Quand je regarde les méthodes d'utilisateur (User.new.methods.include? ("Password_confirmation =")) au moment où l'usine essaye de construire un nouvel utilisateur, il y a une méthode définie par ce nom.

J'ai fait beaucoup de recherches sur ce sujet, et je ne vois rien de lié, donc je suppose que c'est autre chose que je fais.

EDIT:

Un peu plus d'informations - Je suis en mesure de reproduire cela dans un cas simple:

------- .feature

Background: 
    Given user "Bad Admin" with email address "[email protected]" and password "password" exists with "admin" credentials 
    Given user "Good Admin" with email address "[email protected]" 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 

- - factories.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 

Répondre

1

Quelque part dans votre fichier de définition de l'étape, vous devez activer Authlogic avec une méthode étape before:

Before do 
    include Authlogic::TestCase 
    activate_authlogic 
end 

usine de votre utilisateur doit ressembler à celui-ci:

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 

Mais vous n'avez pas besoin utiliser Factory pour la création d'utilisateurs. Voici mon scénario pour l'inscription et pour l'utilisateur existant:

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 "[email protected]" 
    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" | 

L'usine sera utilisée dans le second scénario. Les définitions de l'étape correspondante:

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 
+0

Hi Voidy - Ceci est un code très utile pour configurer concombre et authlogic. Dans mon cas, je n'ai pas de vue d'enregistrement, les utilisateurs sont créés d'une autre manière. Ces utilisateurs sont essentiellement des administrateurs, ils ont donc été créés par une console ou une tâche rake. Ils ont été créés par User.create (: username => '...',: password => '...',: password_confirmation => '...'. Je pourrais créer une interface utilisateur pour cela, mais Je préférerais ne pas - je voudrais comprendre pourquoi cette approche fonctionne quand une fonction est exécutée individuellement, mais pas quand ils sont exécutés en séquence. – Swards

Questions connexes