[英]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
我看到兩個選擇:
如果實際定義了常量,則僅刪除它:
if Object.const_defined?(:User) Object.send(:remove_const, :User) load 'user.rb' # <- you may have to adjust the path end
向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.