2017-05-12 4 views
0

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 

Répondre

0

Une façon naïve de le manipuler est de commencer un nouveau thread et envoyer INT à partir de là après un certain délai d'attente prédéfini:

before do 
    Thread.new do 
     sleep 0.5 
     Process.kill('INT', Process.pid) 
    end 
    end