2016-06-29 16 views
0

Ich habe ein Modell wie folgt aus:Wie Stempeln nicht ActiveRecord-Modelle in Rails?

class Thing 
    class << self 
    def do_stuff(param) 
     result1 = method_one(param) 
     result2 = method_two(result1) 
    end 

    def method_one(param) 
     # tranformation 
    end 

    def method_two(result1) 
     # transformation 
    end 
    end 
end 

Wie kann ich testen, ob do_stuff richtig die Methoden der method_one und method_two mit den richtigen Argumenten ausgeführt wird? Ich habe mock_model/mock_class ausprobiert, aber diese ergeben keinen Sinn für mich. Ich habe die Dokumentation gelesen, aber es fällt mir immer noch schwer, einen Sinn darin zu finden.

Mein Test sieht wie folgt aus:

require 'rails_helper' 

RSpec.describe Thing, type: :model do 
    let!(:param) { create(:param) } 

    describe '#do_stuff' do 
    thing = double('thing') 
    expect(thing).to receive(:method_one).with param 
    thing.do_stuff param 
    end 
end 

Warum funktioniert das nicht? Der Fehler, den ich erhalte, ist, dass das Ding einen unerwarteten Nachrichtenparameter empfangen hat. Aber es war ziemlich erwartet und das war der Test. Wo gehe ich falsch?

Antwort

2

Ich denke, du solltest dein Modell nicht verdoppeln. Das folgende Beispiel funktioniert für mich:

class Thing 
    class << self 
    def do_stuff(param) 
     result1 = method_one(param) 
     result2 = method_two(result1) 
    end 

    def method_one(param) 
     param[:foo] 
    end 

    def method_two(result1) 
     # transformation 
     result1 
    end 
    end 
end 

# thing_spec.rb 
require 'rails_helper' 

RSpec.describe Thing, type: :model do 
    let!(:param) { {foo: "bar"} } 

    describe '#do_stuff' do 
    it 'should do stuff' do 
     expect(Thing).to receive(:method_one).with(param) 
     Thing.do_stuff param 
    end 
    end 
end 

Testergebnis

[[email protected] ~/workspace/tapp]$ be rspec spec/models/thing_spec.rb 
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. (called from block in <top (required)> at /Users/retgoat/workspace/tapp/config/environments/test.rb:16) 
. 

Finished in 0.0069 seconds (files took 1.78 seconds to load) 
1 example, 0 failures 
+0

genau. Um es sukzessiver zu formulieren, müssen Klassenmethoden gegen die Klasse und nicht gegen die Instanz gestempelt werden. – jaydel

+0

Ausgezeichnet danke! Das macht Sinn (schätzen Sie auch, dass Sie sich die Zeit nehmen, den Test zu machen!). – user3162553