was sleep() funktioniert Schienen verwenden?
Teste ich ein Stück von Rails-code, der liest:
sleep(10.0)
In meinem RSpec-tests, Aufruf:
Kernel.should_receive(:sleep).exactly(1).time
gescheitert, und der test geschlafen, für zehn Sekunden. Dies führte mich zu dem Schluss, dass sleep()
in einer Rails-Programm nicht aufrufen Kernel.sleep()
. Ich überprüfte dies, indem Sie meinen Rails-code:
Kernel.sleep(10.0)
... nach dem meine RSpec tests bestanden (und der test hat nicht schlafen).
Führt dies zu einer spezifischen und einer Allgemeinen Frage:
- Was die Implementierung von sleep() hat Rails verwenden (ich bin mit Ruby 1.9.3 /Rails 3.2.1)?
- Der Dolmetscherin, was ist der einfachste Weg zu finden, den Quellcode der Funktion?
- Die einzige andere
sleep
Methode, die ich finden kann, in der ruby-api ist dieMutex#sleep
, so dass könnte es sein: apidock.com/ruby/Mutex/sleep - Wenn Sie möchten, stellen Sie zwei Fragen, die Sie stellen sollten zwei Fragen. Ich wählte zu ignorieren, die zweite Frage in meiner Antwort, da es schon gefragt wurde und antwortete mehrmals auf StackOverflow.
- Jorg: ja, ich war mir bewusst der Gefahren, die von zwei Fragen auf einmal! Danke...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die implizite Empfänger, wenn Sie nicht geben Sie eine explizite Regel, ist
self
, nichtKernel
. (Warum würden Sie denken, dass?)So,
ist in etwa das gleiche wie
und nicht das gleiche, wie
So, es ist Berufung
Kernel#Schlaf
aufself
und nicht aufKernel
. Was bedeutet, Sie müssen die Erwartung auf jedes Objektself
ist in diesem besonderen Methode.self
in Frage, die nicht leicht zugänglich ist. Meine Lösung -- nicht optimal -- war die änderung der source-code explizit aufgerufen werden Kernel.sleep().Kernel#sleep
auf eine Ausnahme auslösen, wenn es mehr als einmal aufgerufen wird, oder mit einem argument unterscheidet sich von 10.0 und dann behaupten, dass keine Ausnahme ausgelöst wird. Oder, statt des monkey-patchingKernel
Sie könnten monkey patch der Klasse, wasself
ist.sleep(10.0)
oder zwei Anrufe zusleep(5.0)
?