2016-06-22 11 views
1

Ich habe folgendes:Wie stub ich einen Methodenaufruf, gefolgt von Hash-Lookup?

request.env['HTTP_REFERER'] 

und wollen die request.env nur Stummel, wenn es durch den Hash-Look folgt.

Irgendwelche Gedanken dazu, wie man das macht?

+0

Warum glauben Sie, dass 'request.env' Methode ist, und nicht ein' Hash'? –

+0

Ich denke, es ist nicht wirklich wichtig, oder? Der Rückgabewert ist ein Hashwert. So ist es wirklich, wie Sie einen Hash-Look nach oben stubeln. –

+0

'request.env' ist gezwungen, ein Objekt zurückzugeben, wenn diese Notation funktionieren soll, aber es ist nicht gezwungen, etwas zu tun. Wenn bei diesem Objekt die '[]' -Methode aufgerufen wird, müssen Sie einen Stub ausführen. Fragen Sie nach einem Stub, der bei Bedarf einen Stub zurückgibt? – tadman

Antwort

1

In Ruby, hash[:foo] ist nur syntaktischer Zucker. Es ist identisch die Methode [] mit dem Argument :foo auf dem Hash zu nennen:

hash = { foo: :bar } 
#=> {:foo=>:bar} 
hash.public_send("[]", :foo) 
#=> :bar 
2

Ich nehme an, Sie #[] Methode von request.env Stub wollen. Eine Möglichkeit besteht darin, in request.env unter Verwendung von define_singleton_method eine Singleton-Methode zu definieren und die ursprüngliche Methode #[] zu überschreiben.

[19] pry(main)> env = { a: 1 } # or whatever object of a class that has #[] 
=> {:a=>1} 
[20] pry(main)> env[:a] 
=> 1 
[21] pry(main)> env.size 
=> 2 
[22] pry(main)> env.define_singleton_method(:[]) { |key| key.upcase } 
=> :[] 
[23] pry(main)> env[:a] 
=> :A 
[24] pry(main)> env.size 
=> 2 
[25] pry(main)> env.define_singleton_method(:[]) { |key| key == 'HTTP_REFERER' ? 'http://example.com' : super(key) } 
=> :[] 
[26] pry(main)> env[:a] 
=> 1 
[27] pry(main)> env['HTTP_REFERER'] 
=> "http://example.com"