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?
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?
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
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"
Warum glauben Sie, dass 'request.env' Methode ist, und nicht ein' Hash'? –
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. –
'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