2016-04-06 11 views
1

Ich habe eine Methode, die wie folgt aufgerufen wird:Wie testen, dass diese Methode mit einer Mischung aus Argumenten und Schlüsselwortargumenten in rspec aufgerufen wird?

post_signup(user, 
      "fb signup completed", 
      app_context: current_app_id, 
      description: "Automatically Populated Via #{current_app_id}") 

Die Argumente sind eine Mischung von Werten und Keyword-Argumente. Das, was mir im Test wichtig ist, ist app_context. Ich habe versucht, so etwas, aber es funktioniert nicht:

it "should log an event with an app_context" do 
     expect(controller).to receive(:post_signup).with(hash_including(app_context: current_app_id)) 

     subject 
     end 

und

it "should log an event with an app_context" do 
     expect(controller).to receive(:post_signup).with(current_app_id, any_args) 

     subject 
     end 

Was kann ein Mensch tun?

+0

nicht verzweifeln gut Bürger, die Magie von 'hash_including' wird dich noch retten! http://www.rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ArgumentMatchers#hash_including-instance_method –

+1

nur bemerkt, dass Sie tatsächlich versucht, dass ...: D aber es sieht aus wie Sie es als das erste Argument versucht. .. aber der Hash ist das zweite Argument, also benötigen Sie etwas wie: 'expect (controller) .to receive (: post_signup) .with (alles, hash_including (app_context: current_app_id))' damit das 'irgendetwas' mit dem ersten übereinstimmt Argument (das ist "Benutzer") und der Hash_Including wird dann auf den Rest davon verwendet (das ist der Hash ...) –

+1

Machen Sie dies zur Antwort @TarynEast – Jwan622

Antwort

2

Verzweifeln Sie nicht guten Bürger, die Magie von hash_including wird Sie noch retten!

Es sieht so aus, als ob Sie es als erstes Argument versucht haben, aber der Hash ist das zweite Argument Ihrer post_signup Methode. Das erste Argument lautet user.

So eine Arbeit zu machen expect Sie so etwas wie bräuchten:

expect(controller).to receive(:post_signup).with(anything, hash_including(app_context: current_app_id)) 

so das alles passt user und die hash_including wird dann auf den Rest der es verwendet ...

+0

wichtiger, ist dies das Zeichen eines spröden Tests? Eine, die zu spezifisch für ihr eigenes Wohl ist? Soll ich die Position von Argumenten in einem Methodenaufruf testen? – Jwan622

+1

Ich glaube nicht, obwohl Sie es alle einen Hash machen könnten und verwenden Sie ': user => user' und dann würde es nur ein Argument geben: D –

Verwandte Themen