在每次rspec测试后,如何确保我班级内的线程结束?

时间:2018-02-14 16:07:26

标签: ruby rspec jruby

我有一个jruby类,其中包含每隔一定时间执行一次操作的心跳:(下面的简化代码)

class Client
  def initialise
    @interval = 30
    @heartbeat = Thread.new do
      begin
        loop do
          puts "heartbeat"
          sleep @interval
        end
      rescue Exception => e
        Thread.main.raise e
      end
    end
  end
end

我有一系列的rspec测试来实例化这个类。

在每次测试结束时,我都希望对象被销毁,但线程似乎仍然存在。

目前我已修复此问题: client.rb:

def kill
    @heartbeat.kill
end

rspec的:

after(:all) do
   client.kill
end

这似乎可以胜任这项工作 - 但这并不是最好的方法。

最好的方法是什么?

使用版本jruby-9.1.10.0& rspec 3.7.0

编辑: 根据{{​​3}}我希望线程在主线程正常时终止 在我的测试中,我使用

实例化客户端
describe Client do
  context 'bla' do
    let(:client) do
      described_class.new
    end
    it 'blas' do
    end
  end
end

1 个答案:

答案 0 :(得分:1)

您应该将after(:all)替换为after(:each)

对于您想要执行的操作,应该是正确的语法,因为after(:all)在运行所有测试用例后进行评估。