Для не вложенных объектов:
Object.entries(o).map(x=>x.join(":")).join("\r\n")
Если вы вызываете засыпание в контексте объекта, вы должны заглушить его для объекта, например:
class Foo
def self.some_method
sleep 5
end
end
it "should call sleep" do
Foo.stub!(:sleep)
Foo.should_receive(:sleep).with(5)
Foo.some_method
end
Ключ в том, чтобы заглушить сон для любого "я", в котором находится контекст, в котором вызывается сон.
Если вы используете Mocha , то будет работать что-то вроде этого:
def setup
Kernel.stubs(:sleep)
end
def test_my_sleepy_method
my_object.take_cat_nap!
Kernel.assert_received(:sleep).with(1800) #should take a half-hour paower-nap
end
Или, если вы используете rr :
def setup
stub(Kernel).sleep
end
def test_my_sleepy_method
my_object.take_cat_nap!
assert_received(Kernel) { |k| k.sleep(1800) }
end
Вам , вероятно, не следует тестировать более сложные проблемы потоковой передачи с помощью модульных тестов. Однако в интеграционных тестах используйте настоящий Kernel.sleep
, который поможет вам выявить сложные проблемы с потоками.
В чистом rspec:
before do
Kernel.stub!(:sleep)
end
it "should sleep" do
Kernel.should_receive(:sleep).with(100)
Object.method_to_test #We need to call our method to see that it is called
end
Мне нужно было установить заглушку, и после долгих поисков я обнаружил, что единственный способ, который сработал для меня, - это
def method_using_sleep
sleep
sleep 0.01
end
it "should use sleep" do
@expectations = mock('expectations')
@expectations.should_receive(:sleep).ordered.with()
@expectations.should_receive(:sleep).ordered.with(0.01)
def sleep(*args)
@expectations.sleep(*args)
end
method_using_sleep
end