簡體   English   中英

使用Object.send(:remove_const,'MyClass')的Ruby問題

[英]Ruby issue using Object.send(:remove_const, 'MyClass')

我想“重新初始化”我的User類,所以我的每個RSpec示例中都有一個新狀態。 我嘗試調用remove_const

before(:each) do
  Object.send(:remove_const, 'User')
  load 'user.rb'
end

describe 'initializer' do
  it 'creates an user' do
    user = User.new("jules", "jules@gg.k")
    expect(user.class).to eq(User)
  end

  it 'saves @email as instance variable' do
    email = "jules@gg.com"
    user = User.new("jules", email)
    expect(user.email).to eq(email)
  end

  # ...
end

但它返回:

NameError: constant Object::User not defined

我的User類如下所示:

class User
  attr_accessor :name, :email
  @@user_list = []
  @@user_count = 0

  def self.user_count
    @@user_count
  end

  def self.all
    @@user_list
  end

  def initialize(name, email)
    @email = email
    @name = name
    @@user_count += 1
    @@user_list << self
  end
end

我看到兩個選擇:

  1. 如果實際定義了常量,則僅刪除它:

     if Object.const_defined?(:User) Object.send(:remove_const, :User) load 'user.rb' # <- you may have to adjust the path end 
  2. User添加類方法以清除內存中的用戶“數據庫”:

     class User def self.clear @@user_list = [] @@user_count = 0 end end 

    並稱之為:

     before(:each) do User.clear end 

我會選擇選項2。

require_relative '../lib/user'

describe User do

    before(:each) do
            Object.send(:remove_const, 'User')
            load 'user'
    end 

    describe 'initializer' do

        it 'creates an user' do
            user = User.new("jules", "jules@gg.k")
            expect(user.class).to eq(User)
        end

        it 'saves @email as instance variable' do
            email = "jules@gg.com"
            user = User.new("jules", email)
            expect(user.email).to eq(email)
        end

        it 'adds one to the @@user_count global variable' do
            count = User.user_count
            user = User.new("jules", "email@email.email")
            expect(User.user_count).to eq(count+1)
        end

    end

    describe 'classe method' do

        describe 'all' do
            it 'should return a list of names of all users' do
                user1 = User.new("jacques", "jacky@chan.fr")
                user2 = User.new("phil", "ph@il.ipe")
                expect(User.all.map! {|k| k.name}).to eq(["jacques", "phil"])
            end
        end

        describe 'find_by_email' do
            it 'should return return a name if user exists and nil otherwise' do
                user1 = User.new("jacques", "jacky@chan.fr")
        user2 = User.new("phil", "ph@il.ipe")
                expect(User.find_by_email("jacky@chan.fr")).to eq("jacques")
            end
        end
    end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM