2012-07-03 21 views
8

jestem testowania kawałek kodu Rails, który brzmi:jaki tryb uśpienia jest używany?

sleep(10.0) 

W moich testów RSpec, nazywając:

Kernel.should_receive(:sleep).exactly(1).time 

zawiodły i testy spali przez dziesięć sekund. To doprowadziło mnie do wniosku, że sleep() w programie Railsowym nie wywołuje Kernel.sleep(). I zweryfikowane przez zmianę mojego kodu szyn:

Kernel.sleep(10.0) 

... po którym moje testy rspec przeszedł (a test nie snu).

Prowadzi to do konkretnego i ogólnego pytania:

  • Co realizacja snu() nie używać Rails (używam Ruby 1.9.3/Rails 3.2.1)?
  • Jaki jest najłatwiejszy sposób znalezienia kodu źródłowego dowolnej funkcji z poziomu interpretera?
+0

Jedyną inną metodą "uśpienia" jaką mogę znaleźć w rubinowym api jest 'Mutex # sleep', więc może to być: http://apidock.com/ruby/Mutex/sleep – Frost

+1

Jeśli chcesz zapytać dwa pytania, powinieneś zadać dwa pytania. Zdecydowałem się zignorować drugie pytanie w mojej odpowiedzi, ponieważ zostało już zadane i kilkakrotnie udzielone na StackOverflow. –

+0

Jorg: Tak, wiedziałem o niebezpieczeństwie zadawania dwóch pytań naraz! Dzięki ... –

Odpowiedz

8

Niejawny odbiorca, jeśli nie zostanie określony jawny, to self, a nie Kernel. (Dlaczego tak myślisz?)

Więc

sleep(10.0) 

jest mniej więcej taka sama jak

self.sleep(10.0) 

i nie wcale taka sama jak

Kernel.sleep(10.0) 

So , nazywa się Kernel#sleep na self, a nie na Kernel. Co oznacza, że ​​musisz ustawić oczekiwanie na dowolny obiekt self w tej konkretnej metodzie.

+0

Doh. Oczywiście. To sprawia, że ​​testowanie jest trudniejsze, ponieważ funkcja sleep() może znajdować się kilka warstw w dół, a samo "pytanie" nie jest łatwo dostępne. Moje rozwiązanie - nie optymalne - polegało na zmianie kodu źródłowego, aby jawnie wywoływał Kernel.sleep(). –

+0

Moglibyście łatać małpie 'Kernel # sleep', aby podnieść wyjątek, jeśli jest on wywoływany więcej niż jeden raz lub z innym argumentem niż 10.0, a następnie stwierdzić, że nie zgłoszono wyjątku. Lub, zamiast łatania małpy 'Kernel', możesz małpować łatkę klasy jakiejkolwiek" jaźni ". –

+0

Ale tak naprawdę wygląda na to, że testujesz coś niewłaściwego lub na niewłaściwym poziomie. Dlaczego nie możesz pobrać odniesienia do obiektu, aby ustawić na nim oczekiwanie? Jakie jest * rzeczywiste * zachowanie, które chcesz osiągnąć, i czy naprawdę * zastanawiasz się, czy to konkretne zachowanie jest osiągnięte przez pojedyncze wywołanie "uśpienia (10.0)" lub dwa wywołania "uśpienia (5.0)"? –

Powiązane problemy