3 Stimmen

Undefined method 'password_confirmation' für User: Testing Authlogic mit Cucumber und Factory Girl

Meine Tests funktionieren einwandfrei, wenn ich sie einzeln teste,

rake cucumber FEATURE = 'Pfad/zum/Feature'

aber wenn ich versuche,

rake cucumber

zu starten, schlagen sie mit dem folgenden Fehler fehl

undefined method `password_confirmation=' for # (NoMethodError)

Dies tritt auf, wenn ich versuche, einen Benutzer mit Factory.build(:user) zu erstellen. Ich habe eine Datei mit Fabriken, die einen :user definiert.

Ich weiß nicht wirklich, wie ich das bestätigen soll, aber es ist, als ob authlogic nicht vorhanden ist und das Benutzermodell die hinzugefügten Methoden noch nicht hat. Wenn ich die Benutzermethoden anschaue (User.new.methods.include?("password_confirmation=")) zum Zeitpunkt, wenn die Fabrik versucht einen neuen Benutzer zu erstellen, gibt es eine nach diesem Namen benannte Methode.

Ich habe viel dazu recherchiert, und ich sehe nichts dazu, also gehe ich davon aus, dass es etwas anderes ist, was ich tue.

BEARBEITEN:

Etwas mehr Information - Ich konnte das in einem einfachen Fall reproduzieren:

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

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

1voto

Voldy Punkte 12526

Irgendwo in Ihrer Schrittdefinitionsdatei sollten Sie Authlogic mit einer before-Schrittmethode aktivieren:

Before do
  include Authlogic::TestCase
  activate_authlogic
end

Ihre Benutzer-Factory sollte so aussehen:

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

Sie müssen jedoch Factory nicht für die Benutzererstellung verwenden. Hier ist mein Szenario für die Registrierung und für bestehende Benutzer:

  Szenario: Erfolgreiche Registrierung
    Angenommen, ich bin ein anonymer Benutzer
    Und ich bin auf der Startseite
    Wenn ich auf "Jetzt beitreten!" klicke
    Und ich fülle "Benutzername" mit "test" aus
    Und ich fülle "E-Mail" mit "test@mail.ru" aus
    Und ich fülle "Passwort" mit "geheim" aus
    Und ich fülle "Passwort bestätigen" mit "geheim" aus
    Und ich drücke "Mein Konto erstellen"
    Dann sollte ich eingeloggt sein

  Szenario: Anzeigen von Anmelden oder Abmelden und Registrieren-Links
    Angenommen, die folgenden Benutzerdatensätze
      | Benutzername | Passwort |
      | test         | geheim   |
    Angenommen, ich bin eingeloggt als "" mit dem Passwort "geheim"
    Wenn ich zur Startseite gehe
    Dann sollte ich 
    Und ich sollte 
    Beispiele:
      | login | action 1       | action 2         |
      | test  | "Abmelden" anzeigen | "Mein Profil" anzeigen |
      |       | "Anmelden" anzeigen  | "Registrieren" anzeigen    |

Factory wird im zweiten Szenario verwendet. Entsprechende Schrittsdefinitions:

Angenommen /^ich bin ein anonymer Benutzer$/ do
  !UserSession.find
end

Dann /^ich sollte eingeloggt sein$/ do
  UserSession.find
end

Angenommen /^die folgenden (.+) Datensätze$/ do |factory, table|
  table.hashes.each do |hash|
    Factory(factory, hash)
  end
end

Angenommen /^ich bin eingeloggt als "([^\"]*)" mit dem Passwort "([^\"]*)"$/ do |benutzername, passwort|
  unless benutzername.blank?
    Besuche anmelden_url
    Fülle "Benutzername" mit benutzername aus
    Fülle "Passwort" mit passwort aus
    Klicke auf "Anmelden"
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X