2016-03-30 13 views
1

Wie würde ich in einem RSpec-Test in dem folgenden Code überprüfen, dass der Konstruktor der Klasse B ruft den Konstruktor der Klasse A mit das richtige Argument?RSpec Stubbing und Überprüfung von Argumenten, wenn ein Konstruktor eines Objekts instanziiert eine andere

class A 
    def initialize(*args) 
    end 
end 

class B < A 
    def initialize 
    super(1) 
    end 
end 

Der Test I Arbeiten so lange, wie ich (die „.mit“ auslassen)

describe B do 
    describe '#new' do 
    it { 
     allow(A).to receive(:new).with(any_args)                                  
     B.new 
     expect(A).to have_received(:new).with(1) 
    }  
    end 
end 

Hinzufügen der Prüfung für die Argumente gibt mir die folgende Fehlermeldung nicht die Argumente prüfen:

B 
    #new 
    should have received new(1) 1 time (FAILED - 1) 

Failures: 

    1) B#new should have received new(1) 1 time 
    Failure/Error: expect(A).to have_received(:new).with(1) 

     #<A (class)> received :new with unexpected arguments 
     expected: (1) 
       got: (no args) 

Dies scheint den Konstruktor für die Klasse A, um anzuzeigen, ohne Argumente aufgerufen wird?

Antwort

0

Sie sind vielleicht besser für Nebenwirkungen überprüft (warum wollen Sie super genannt werden?) Oder überprüfen, ob Super genannt wurde:

expect_any_instance_of(B).to have_received(:super).with(1) 
1

Wenn Sie super in Ihrer initialize Methode für B nennen, es ruft initialize in A, nicht new. Sie könnten testen, dass eine Instanz von Ainitialize mit einem Argument erhält:

expect_any_instance_of(A).to receive(:initialize).with(1) 
B.new 

Aber RSpec für stubbing initialize bei Ihnen beschweren.

Verwandte Themen