J'ai des difficultés à écrire des tests d'intégration (pas de stubbing) pour le scénario suivant: un processus (tâche rake) qui s'exécute en boucle, en émettant des valeurs. Voici une approximation du cas d'utilisation.Comment écrire un test d'intégration pour une boucle?
Le test réussira si je contrôle-C it, mais je voudrais qu'il attrape la condition de succès et s'arrête.
Quelqu'un a de bonnes suggestions? (écrasant/moqueur ne sont pas de bonnes suggestions). Je suppose qu'il peut y avoir un moyen d'ordonner à RSpec d'arrêter un processus après le retour d'un matcher.
describe 'rake reactor' do
it 'eventually returns 0.3' do
expect { Rake::Task['reactor'].execute }.to output(/^0\.3.*/).to_stdout
end
end
class Reactor
def initialize
@stop = false
end
def call
loop do
break if stop?
sleep random_interval
yield random_interval
end
end
def stop
@stop = true
end
def stop?
@stop == true
end
def random_interval
rand(0.1..0.4)
end
end
desc 'Start reactor'
task reactor: :environment do
reactor = Reactor.new
trap(:INT) do
reactor.stop
end
reactor.call { |m| p m }
end