Soru RSpec: Çekirdek Çekirdek :: uyku?


Bir rspec senaryosunda Kernel.sleep'ı yerleştirmenin bir yolu var mı?


36
2017-07-22 23:40


Menşei


Kernel :: stubs (: uyku) ötesinde bir şey mi arıyorsunuz? - Sam Saffron
Çalışmak ve uyumak istemesini, belki de testini yavaşlattığını hayal edebiliyorum. - Rich


Cevaplar:


Bir nesnenin bağlamında uyku çağırıyorsanız, nesneyi şu şekilde etiketlemelisiniz:

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

Anahtar, uykunun çağrıldığı bağlamda ne varsa "kendini" uydurmaktır.


45
2017-08-20 03:44



Benim için harika çalışıyor, şerefe! - opsb
Test altındaki nesneyi kullanmak, iyi bir fikir değildir. Örnekler için bkz: robots.thoughtbot.com/don-t-stub-the-system-under-test - georgebrock
ilgisiz nedenlerle @ georgebrock, değil mi? inanıyorum bu niyetini en iyi ifade eden yoldur. Ve yeni sözdizimi kullanıyor olmalı. allow_any_instance_of(Object).to receive(:sleep) - x-yuri


Çağrı ne zaman sleep bir nesne içinde değil (örneğin bir komisyon görevini test ederken), aşağıdakileri bir önceki satırda ekleyebilirsiniz (rspec 3 sözdizimi)

allow_any_instance_of(Object).to receive(:sleep)

13
2018-01-02 22:16





Saf rspec'te:

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

4
2017-07-30 11:22



Açıklığa kavuşturmak için, çünkü bu hemen benim için işe yaramadı, bu şekilde alay etmek için Kernel.sleep'ı çağırmalısınız. Sadece uyku aramak doğrudan başarısız olur - Jeff D
Evet, aradığınız yöntemin içinde uyuyacak. - nitecoder


Kullanıyorsanız koyun derisiSonra böyle bir şey işe yarayacak:

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

Ya da kullanıyorsanız 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

Sen muhtemelen ünite testleri ile daha karmaşık iş parçacığı sorunlarını test etmemelidir. Ancak entegrasyon testlerinde gerçek Kernel.sleepBu, karmaşık iş parçacığı sorunlarını ortaya çıkarmanıza yardımcı olacak.


3
2017-07-23 12:12





Gereksiz yere arama yapmam gerekti ve uzun bir aradan sonra benim için işe yarayan tek yolun bu olduğunu gördüm.

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

0
2017-08-17 01:03





Burada çalışmak için diğer çözümleri elde edemedim. Belki de Ruby'nin yeni sürümlerinde ya da başka bir şeyde uykunun işlenmesinde bir şeyler değişti.

Sonunda ne yaptım maymun yama için oldu Nesne Göründüğü gibi bu sınıf, uyku çağrılarını alır. Bu yüzden şunu ekledim:

class Object
    def sleep(*args)
    end
end

Yani uyku metodu artık bir şeyin yerine hiçbir şey yapmıyor. Bu daha iyi alay etmenin bir yolu olabilir, ama alay etmeden iyi bir çözüm bulamadım. sleep metohd Potansiyel olarak kullanılan her nesnenin.


0
2017-10-22 11:34



Lütfen benim çözümüm feryat bakın. rspec-mock burada, bu yüzden maymun-yama yok - Benj