Hier ist der Fehler, den ich bekomme, wenn ich versuche, meine Tests mit RSpec auszuführen:
C:/Ruby193/lib/ruby/gems/1.9.1/gems/activesupport-3.2.11/lib/active_support/infl
ector/methods.rb:230:in `block in constantize': nicht initialisierte Konstante User (Nam
eError)
Ich versuche, FactoryGirl mit RSpec zu verwenden, aber ohne Rails. Hier sind die Dateien, die am Test teilnehmen:
user_spec.rb
require 'spec_helper'
module Bluereader
describe User do
describe 'login' do
user = FactoryGirl.build(:user)
end
describe 'logout' do
describe 'create_account' do
describe 'delete_account' do
spec/spec_helper
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
$LOAD_PATH.unshift(File.dirname(__FILE__))
require 'rspec'
require 'lib/bluereader'
require 'factory_girl'
FactoryGirl.find_definitions
spec/factories.rb
require 'digest/sha1'
FactoryGirl.define do
sequence(:username) { |n| "user-#{n}" }
factory :user do
username
encrypted_password Digest::SHA1.hexdigest('password')
full_name 'John Doe'
logged_in_at Time.now
logged_out_at 0
end
end
Zu diesem Zeitpunkt weiß ich, dass die Datei factories.rb
geladen wird (ich habe es mit dem idiotischen Print-Debugging versucht). Wenn ich die Zeile user = FactoryGirl.build(:user)
aus user_spec.rb entferne, erhalte ich keine Fehler (und das normale RSpec-Feedback, dass keine Tests vorhanden sind, aber keine Fehler). Falls es dich interessiert, hier ist mein Modell:
require 'digest/sha1'
module Bluereader
class User < ActiveRecord::Base
has_many :categories, :foreign_key => :user_id
has_many :news, :foreign_key => :user_id
has_many :settings, :foreign_key => :user_id
attr_reader :full_name
class << self
def login(username, password)
encrypted_password = Digest::SHA1.hexdigest(password)
if not User.exists?(:username => username, :encrypted_password => encrypted_password)
user_id = User.id_from_username(username)
update(user_id, :logged_in_at => Time.now, :logged_out_at => 0)
end
end
def logout
update(current_user.id, :logged_out_at => Time.now)
end
def validate_account(username, password, full_name)
if username.empty? or password.empty or full_name.empty?
return 'Bitte fülle alle Felder aus.'
end
if User.exists?(:username => username)
return 'Dieser Benutzername wird bereits verwendet.'
unless username =~ /^\w+$/
return 'Das Benutzernamefeld darf nur Buchstaben, Zahlen und Unterstriche enthalten.'
''
def create_account(username, password, full_name)
encrypted_password = Digest::SHA1.hexdigest(password)
User.create(:username => username,
:encrypted_password => encrypted_password,
:full_name => full_name,
:logged_in_at => Time.now,
:logged_out_at => 0)
end
def delete_account
current_user.destroy
end
private
def id_from_username(username)
user = where(:username => username).first
user.nil? ? 0 : user.id
end
def current_user
where(:logged_out_at => 0).first
end
end
end
end
LÖSUNG
Das Problem bestand darin, dass die Klasse User in einem Modul war, hier ist die Lösung:
factory :user, class: Bluereader::User do