2016-06-27 5 views
3

Ich möchte ein Active Record Modell für Rspec Test erstellen.Callback bei Create Rails überspringen

Allerdings hat dieses Modell Callbacks, nämlich: before_create und after_create Methode (ich denke, diese Methoden werden Callbacks nicht Validierung genannt, wenn ich nicht falsch liege).

Gibt es eine Möglichkeit, ein Objekt zu erstellen, ohne die Rückrufe auszulösen?

Einige frühere Lösungen, die ich versucht habe/nicht für meinen Fall arbeiten:

Update-Methode:

update_column und andere Update-Methoden wird nicht funktionieren, weil ich ein Objekt erstellen möchte und ich kann Verwenden Sie keine Update-Methoden, wenn das Objekt nicht existiert.

Factory Girl und nach Körperbau:

FactoryGirl.define do 
    factory :withdrawal_request, class: 'WithdrawalRequest' do 
    ... 
    after(:build) { WithdrawalRequest.class.skip_callback(:before_create) } 
    end 
end 

Ausfall/Fehler: nach (: build) {WithdrawalRequest.class.skip_callback (: before_create)}

NoMethodError: nicht definierte Methode `skip_callback 'für die Klasse: Klasse

Skip callbacks on Factory Girl and Rspec

überspringen Rückruf

WithdrawalRequest.skip_callback(:before_create) 

withdrawal_request = WithdrawalRequest.create(withdrawal_params) 

WithdrawalRequest.set_callback(:before_create) 

Ausfall/Fehler: WithdrawalRequest.skip_callback (: before_create)

NoMethodError: nicht definierte Methode `_before_create_callbacks' für #

How to save a model without running callbacks in Rails

Ich habe auch versucht

WithdrawalRequest.skip_callbacks = true 

Was nicht funktioniert.

---------- ----------- EDIT

Meine Fabrik-Funktion bearbeitet wird:

after(:build) { WithdrawalRequest.skip_callback(:create, :before, :before_create) } 

Meine before_create Funktion sieht wie folgt aus :

class WithdrawalRequest < ActiveRecord::Base 
    ... 
    before_create do 
    ... 
    end 
end 

---------- EDIT 2 -----------

I veränderte die before_create auf eine Funktion, so dass ich es referenzieren. Ist beides eine bessere Praxis?

class WithdrawalRequest < ActiveRecord::Base 
    before_create :before_create 
    ... 
    def before_create 
    ... 
    end 
end 

Antwort

3

auf der referenzierten Antwort Basierend:

FactoryGirl.define do 
    factory :withdrawal_request, class: 'WithdrawalRequest' do 
    ... 
    after(:build) { WithdrawalRequest.skip_callback(:create, :before, :callback_to_be_skipped) } 
    #you were getting the errors here initially because you were calling the method on Class, the superclass of WithdrawalRequest 

    #OR 
    after(:build) {|withdrawal_request| withdrawal_request.class.skip_callback(:create, :before, :callback_to_be_skipped)} 

    end 
end 
+0

Vielen Dank für die Antwort.Aber ich habe immer noch Fehler (es macht immer noch den Rückruf) Ich habe die Frage mit der before_create do-Funktion hinzugefügt. Weißt du, was diesen Fehler verursachen könnte? (Bitte beachten Sie die Bearbeitung für weitere Informationen) – seokhoonlee