4

这是我尝试使用 RSpec 运行测试时遇到的错误:

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': uninitialized constant User (Nam
eError)

我正在尝试使用 RSpec 但没有 Rails 运行 FactoryGirl。以下是参与测试的文件:

user_spec.rb

require 'spec_helper'

module Bluereader
  describe User do
    describe 'login' do
      user = FactoryGirl.build(:user)
    end

    describe 'logout' do

    end

    describe 'create_account' do

    end

    describe 'delete_account' do

    end
  end
end

规格/规格助手

$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

规格/工厂.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

此时我知道factories.rb文件正在加载(我尝试过使用白痴打印调试)。当我从user_spec.rbuser = FactoryGirl.build(:user)中删除该行时,我没有收到任何错误(并且正常的 RSpec 反馈告诉我没有测试,但没有错误)。如果你有兴趣,这是我的模型:

需要“摘要/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 'Please fill in all the fields.'
        end

        if User.exists?(:username => username)
          return 'That username is already in use.'
        end

        unless username =~ /^\w+$/
          return 'Username field should contain only letters, numbers and underscores.'
        end

        ''
      end

      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

解决方案

问题是 User 类在一个模块中,这是解决方案:

factory :user, class: Bluereader::User do

4

3 回答 3

1

您需要在您的规范帮助文件中要求 rails 环境。将以下内容添加到 spec/spec_helper.rb:

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

更新

即使你不使用 Rails,你仍然需要在你的规范助手中使用模型。

于 2013-02-20T01:27:37.620 回答
1

取自问题的底部

问题是 User 类在一个模块中,这是解决方案:

factory :user, class: Bluereader::User do
于 2020-02-07T14:49:24.393 回答
0

对于像我这样笨拙的人,你可能FactoryGirl在你的代码中有你想要的地方FactoryBot

于 2021-02-08T12:18:54.840 回答