4 Stimmen

Uninitialisierte Konstante (NameError) bei Verwendung von FactoryGirl in Modul

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

1voto

Peter Brown Punkte 49760

Sie müssen die Rails-Umgebung in Ihrer Datei spec helper benötigen. Fügen Sie folgendes zu spec/spec_helper.rb hinzu:

require File.expand_path("../../config/environment", __FILE__)

Aktualisieren

Auch wenn Sie Rails nicht verwenden, müssen Sie immer noch die Models in Ihrem Spec-Helper benötigen.

1voto

Stefan Collier Punkte 4008

Aus dem unteren Teil der Frage entnommen

Das Problem war, dass die Klasse User in einem Modul war, hier ist die Lösung:

factory :user, class: Bluereader::User do

0voto

stevec Punkte 25346

Für jeden Tollpatsch wie mich, könnte es sein, dass du FactoryGirl in deinem Code hast, wo du eigentlich FactoryBot haben wolltest

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