Existe-t-il un moyen de copier Kernel.sleep dans un scénario rspec?RSpec: stubbing Kernel :: sommeil?
Répondre
Si vous appelez le sommeil dans le contexte d'un objet, vous devez stub sur l'objet, comme suit:
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
la clé est, à dormir sur stub quel que soit le "soi" dans le contexte où le sommeil est appelé.
Travaillé génial pour moi, bravo! – opsb
La réduction de l'objet à tester n'est pas une bonne idée. Pour des exemples, voir: http://robots.thoughtbot.com/don-t-stub-the-system-under-test – georgebrock
@georgebrock pour une raison non pertinente, n'est ce pas? Je crois que [this] (http://stackoverflow.com/a/27749263/52499) est le moyen qui exprime le mieux l'intention. Et doit utiliser une syntaxe plus récente. 'allow_any_instance_of (Object) .pour recevoir (: sleep)' –
si vous utilisez Mocha, alors quelque chose comme cela fonctionnera:
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
Ou si vous utilisez 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
Vous probablement ne doit pas être un test plus problèmes de thread complexes avec des tests unitaires. Cependant, sur les tests d'intégration, utilisez le vrai Kernel.sleep
, qui vous aidera à résoudre les problèmes de threads complexes.
En rspec pur:
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
Pour clarifier, parce que ça n'a pas fonctionné pour moi tout de suite, tu dois appeler Kernel .sleep, afin de se moquer de cette façon. Le simple appel du sommeil échoue directement –
Oui, la méthode que vous appelez aura ce sommeil. – nitecoder
je devais bouchonner requiers et après de longues recherches, je trouve que la seule façon qui a fonctionné pour moi ce
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
Je n'ai pas réussi à obtenir les autres solutions ici. Peut-être que quelque chose a changé dans la façon dont le sommeil est géré dans les nouvelles versions de Ruby, ou quelque chose d'autre. Ce que j'ai fini par faire était de corriger la classe Object car il semble que c'est ce qui reçoit les appels de sommeil. Donc, j'ai simplement ajouté ceci:
class Object
def sleep(*args)
end
end
Ainsi, la méthode de sommeil ne plus rien au lieu de quelque chose. Il pourrait y avoir un moyen de se moquer de cela mieux, mais je ne pouvais pas trouver une bonne solution sans se moquer du sleep metohd
de chaque objet qui l'utilisait potentiellement.
S'il vous plaît voir ma solution ci-dessous. rspec-mock est ici, donc vous n'avez pas besoin de patch – Benj
Lorsque l'appel à sleep
est pas dans un objet (tout en testant une tâche de coupe par exemple), vous pouvez ajouter ce qui suit dans un avant bloc (rspec 3 syntaxe)
allow_any_instance_of(Object).to receive(:sleep)
- 1. Stubbing Chained Méthodes avec Rspec
- 2. Linux redhat kernel-headers
- 3. NT Kernel Programming
- 4. Multicasting + Linux Kernel
- 5. Ajouter insmod Module HID Kernel
- 6. temps de sommeil en boucle
- 7. Mac X Framework Kernel non trouvé
- 8. Comment arrêter un PDA en sommeil
- 9. sommeil de fil dans une boucle
- 10. rspec maquette question
- 11. Comment démarrer avec Rspec?
- 12. Obtenir RSpec en RDoc
- 13. Stubbing automatique dans le mot java. Que utiliser?
- 14. Problèmes avec RSpec et Chronic
- 15. Qu'est-ce que l'API KMS (kernel mode setting) du noyau?
- 16. Doute concernant Winsock Kernel Buffer et algorithme Nagle
- 17. Processus d'affichage Mysql - Commandes de sommeil et quoi faire
- 18. gérer le sommeil dans le service exécuteur programmé java
- 19. Réveillez-vous de l'événement de sommeil sur l'iPhone?
- 20. La fonction de sommeil de PHP et les connexions client
- 21. Test du contrôleur RSpec - réponse vide.body
- 22. Rspec « devrait changer » avec virgule flottante
- 23. Impossible de trouver le générateur 'rspec'
- 24. commutation Test :: unité avec rspec sous rails
- 25. Test d'une balayeuse avec RSpec dans Rails
- 26. Comment différencier les chaînes multilignes avec RSpec?
- 27. Test AutoTest et Rspec avec Rails
- 28. vérifier pour (l'absence de) `puts` dans RSpec
- 29. Comment dire plusieurs fois « should_receive » dans RSpec
- 30. Rspec - Problèmes avec le passage des plugins aux gems
Vous cherchez quelque chose au-delà de Kernel :: stubs (: sleep) –
J'imagine qu'il voudrait que ça marche et ne dorme pas, peut-être ralentir son test ... – Rich