2016-09-06 6 views
0

У меня есть классСоздание какой-либо класс во время испытаний (ИППП)

Gate < ActiveRecord::Base 
    self.inheritance_column = :kindof 
# some methods 
end 
# and derived 
MoneyHaters < Gate 
# some overloaded methods 
end 

с колонки типа: kindof для STI.

Durning tests Я хочу создать 2-3 ребенка. В основном потому, что каждый производный класс должен быть уникальным в приложении. Как что:

factory :gate do 
    before(:create) do 
    gate_name = FFaker::Company.name.gsub(/\s+/,'') 
    gate_class_name = gate_name.singularize.classify 
    end 

    name { gate_name } 

    # I want that next class will be declared in App namespace, like all others. 
    gate_class = Class.new(Gate) do 
    def comission_in(amount) 
     amount * 0.01 + 5 
    end 
    def comission_out(amount) 
     amount * 0.02 + 5 
    end 
    end 
    Object.const_set(gate_class_name, gate_class) 

    type { gate_class_name } 
    country { FFaker::Address.country_code } 
end 

Код дал мне ошибку, когда побежал с RSpec в строке «Object.const_set»

TypeError: #<FactoryGirl::Declaration::Implicit:0x00000006a1af30 @name=:gate_class_name, @ignored=false, @factory=#<FactoryGirl::Definition:0x00000006ed6df8 @declarations=#<FactoryGirl::DeclarationList:0x00000006ed6dd0 @declarations=[#<FactoryGirl::Declaration::Dynamic:0x00000006ed6998 @name=:name, @ignored=false, @block=#<Proc:[email protected][skipped]>>, #<FactoryGirl::Declaration::Implicit:0x00000006a1af30 ...>], @name=:gate, @overridable=false>, @callbacks=[#<FactoryGirl::Callback:0x00000006ed6a38 @name=:before_create, @block=#<Proc:[email protected][skipped]>>], @defined_traits=#<Set: {}>, @to_create=nil, @base_traits=[], @additional_traits=[], @constructor=nil, @attributes=nil, @compiled=false>> is not a symbol nor a string 

но работает нормально в рельсах консоли

Обычно я называю FactoryGirl фабрики для создания объектов , но, если это невозможно, я задаюсь вопросом о любом другом методе.

Любая помощь очень ценится.

+0

не уверен, зачем вам нужны специальные классы для испытаний. Вы не можете использовать уже существующие? –

+1

Возможно, вы используете STI неправильно? –

+0

Код в комментариях нечитабельный. Положите это на вопрос. –

ответ

0

Хорошо, я провожу около двух часов, прежде чем отправлять на этот вопрос, но я нашел ответ только после размещения =)

я только переместить определение класса внутри одного атрибута.

FactoryGirl.define do 
    factory :gate do 

    name { FFaker::Company.name } 
    type { 
     class_name = 'Gate' + name.gsub(/[[:blank:][:cntrl:][:punct:]]/,'').to_s.singularize 
     gate_class = class_name.classify 
     class_instance = Class.new(Gate) do 
     def comission_in(amount) 
      amount * 0.01 + 5 
     end 
     def comission_out(amount) 
      amount * 0.02 + 5 
     end 
     end 
     Object.const_set(gate_class, class_instance) 
     puts " gate_class: '#{ gate_class }'; name: '#{ name }';" 
     class_name 
    } 
    country { FFaker::Address.country_code } 

    end 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^