ich einen Teil meiner Foos Controller in ein neues Schienen-Modell die Aktion auszuführen extrahiert haben:Wie ein Schiene PORO von Controller aufgerufen testen
foos_controller.rb
class FoosController < ApplicationController
respond_to :js
def create
@foo = current_user.do_something(@bar)
actioned_bar = ActionedBar.new(@bar)
actioned_bar.create
respond_with @bar
end
actioned_bar.rb
class ActionedBar
def initialize(bar)
@bar = bar
end
def create
if @bar.check?
# do something
end
end
end
ich habe es zuerst arbeiten, aber jetzt versuche ich die rspec Co Back-füllen Kinderwagen-Tests.
Ich werde die verschiedenen Modellmethoden testen und mache einen Funktionstest, um sicherzustellen, dass es in dieser Hinsicht ok ist, aber ich möchte einen Test hinzufügen, um sicherzustellen, dass das neue actioned_bar-Modell von den Foos aufgerufen wird Controller mit @bar.
Ich weiß in rspec können Sie das etwas receives
etwas with
etwas arguments
testen, aber ich habe Mühe, dies zur Arbeit zu bekommen.
it "calls ActionedBar.new(bar)" do
bar = create(:bar)
expect(ActionedBar).to receive(:new)
xhr :post, :create, bar_id: bar.id
end
Dies allerdings nicht funktioniert, die Konsole Berichte:
NoMethodError:
undefined method `create' for nil:NilClass
, die, weil es diese nur seltsam tut, wenn ich expect(ActionedBar).to receive(:new)
verwenden, funktioniert der Rest der Reglertests in Ordnung.
Wenn ich versuche zu tun:
it "calls ActionedBar.new(bar)" do
bar = create(:bar)
actioned_bar = ActionedBar.new(bar)
expect(actioned_bar).to receive(:create).with(no_args)
xhr :post, :create, bar_id: bar.id
end
die Konsole sagt:
(#<ActionedBar:0xc8f9f74>).create(no args)
expected: 1 time with no arguments
received: 0 times with no arguments
Wenn ich einen put
in der Steuerung zu tun, während der Test ausgeführt wird; Aus irgendeinem Grund führt dieser Test dazu, dass die actioned_bar im Controller als nil
ausgegeben wird, aber für alle anderen Controller-Tests in Ordnung ist.
Kann ich testen, ob ActionedBar in dieser Controller-Spezifikation aufgerufen wird?
Dank Maxim Khan-Magomedov, beide Tests funktionierten gut. Ich fügte auch einen zusätzlichen Test hinzu, wie max in seiner Antwort andeutet, um sicherzustellen, dass der aktivierte Balken tatsächlich ausgeführt wird. – user1116573