2012-07-03 25 views
8

Tôi đang thử nghiệm một đoạn mã Rails mà đọc:những gì ngủ() Rails sử dụng?

sleep(10.0) 

Trong các thử nghiệm RSpec tôi, gọi:

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

thất bại và thử nghiệm ngủ trong vòng mười giây. Điều này khiến tôi kết luận rằng sleep() trong chương trình Rails không gọi số Kernel.sleep(). Tôi đã xác minh điều này bằng cách thay đổi mã Rails của tôi thành:

Kernel.sleep(10.0) 

... sau đó các kiểm tra RSpec của tôi đã qua (và thử nghiệm không ngủ).

Điều này dẫn đến một cụ thể và một câu hỏi chung:

  • gì thực hiện giấc ngủ() không Rails sử dụng (Tôi đang chạy của Ruby 1.9.3/Rails 3.2.1)?
  • Từ trình thông dịch, cách dễ nhất để tìm mã nguồn cho bất kỳ chức năng nào?
+0

Phương pháp 'ngủ' khác duy nhất tôi có thể tìm thấy trong api ruby ​​là' Mutex # sleep', vì vậy có thể là: http://apidock.com/ruby/Mutex/sleep – Frost

+1

Nếu bạn muốn hỏi hai câu hỏi, bạn nên hỏi hai câu hỏi. Tôi đã chọn để bỏ qua câu hỏi thứ hai trong câu trả lời của tôi, vì nó đã được hỏi và trả lời nhiều lần trên StackOverflow. –

+0

Jorg: Yah, tôi đã nhận thức được sự nguy hiểm khi hỏi hai câu hỏi cùng một lúc! Cảm ơn ... –

Trả lời

8

Trình thu thập ngầm, khi bạn không chỉ định rõ ràng, là self, không phải Kernel. (Tại sao bạn sẽ nghĩ rằng?)

Vì vậy,

sleep(10.0) 

là gần giống như

self.sleep(10.0) 

không ở tất cả giống như

Kernel.sleep(10.0) 

Vì vậy, , nó đang gọi Kernel#sleep trên self và không phải trên Kernel. Điều này có nghĩa là bạn cần đặt kỳ vọng vào bất kỳ đối tượng nào self là trong phương thức cụ thể đó.

+0

Doh. Tất nhiên. Điều đó làm cho việc kiểm thử trở nên khó khăn hơn, vì giấc ngủ() có thể là một vài tầng xuống và 'self' trong câu hỏi không dễ tiếp cận. Giải pháp của tôi - không tối ưu - là thay đổi mã nguồn để gọi Kernel.sleep() một cách rõ ràng. –

+0

Bạn có thể khỉ vá 'Kernel # sleep' để tăng ngoại lệ nếu nó được gọi nhiều hơn một lần hoặc với đối số khác với 10,0 và sau đó khẳng định rằng không có ngoại lệ nào được nâng lên. Hoặc, thay vì khỉ vá 'Kernel', bạn có thể khỉ vá lớp của bất kỳ' self' là gì. –

+0

Nhưng thực sự, có vẻ như bạn đang thử nghiệm điều sai hoặc ở cấp độ sai. Tại sao bạn không thể lấy một tham chiếu đến đối tượng để đặt kỳ vọng vào nó? Hành vi * thực tế * mà bạn muốn đạt được là gì, và bạn có thực sự quan tâm liệu hành vi cụ thể đó có đạt được bằng một cuộc gọi duy nhất tới 'sleep (10.0)' hay hai lệnh gọi 'sleep (5.0)'? –

Các vấn đề liên quan