2016-09-06 3 views
0

Erstellen habe ich eine Klasseeinige Klassen während der Tests (STI)

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

mit Typ-Spalte: kindof für STI.

Durning Tests Ich möchte ein 2-3 Kinder erstellen. Vor allem, weil jede abgeleitete Klasse in der App eindeutig sein muss. Wie folgt aus:

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 

-Code gab mir Fehler, wenn sie mit rspec in line "Object.const_set" lief

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 

aber funktioniert ok in Schienen Konsole

Normalerweise nenne ich factory Fabriken für die Erstellung von Objekten Aber, wenn das nicht möglich ist - ich frage mich nach einer anderen Methode, das zu tun.

Jede Hilfe wird sehr geschätzt.

+0

nicht sicher, warum benötigen Sie spezielle Klassen für Tests. Kannst du die schon vorhandenen nicht benutzen? –

+1

Vielleicht verwenden Sie STI falsch? –

+0

Code in Kommentaren ist nicht lesbar. Leg das in die Frage. –

Antwort

0

Ok, verbringe ich etwa zwei Stunden vor der Frage veröffentlichen, aber ich fand Antwort erst nach = Posting)

ich nur musste die Klassendefinition innerhalb Attributs einer bewegen.

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 
Verwandte Themen