在Ruby中进行测试的前台运行后台进程的好方法是什么?

时间:2012-12-12 01:15:42

标签: ruby rspec tdd sinatra backgroundworker

使用Sinatra应用程序,找到了3种运行后台进程的方法:

  1. Thread.new
  2. Process.fork
  3. Process.spawn
  4. 想出如何让前两个工作,但现在的挑战是测试需要同步运行(出于几个原因)。

    在生产中异步运行作业的好方法是什么,但强制测试同步运行?最好通过spec_helper ...?

    进行通话

    Ruby 1.9.3,Sinatra app,RSpec。

2 个答案:

答案 0 :(得分:2)

我推荐以下混合方法:

  1. 编写简单的单元测试并重构您正在测试的同步。换句话说,将所有后台功能放入简单的类和方法中,可以轻松进行单元测试。然后后台进程可以调用相同的功能,这已经过单元测试。你不应该对后台线程/进程创建本身进行单元测试,因为这已经在ruby(或godbluepillDaemons等其他库中进行了测试。这种TDD方法有使代码库更易于维护的额外好处。

  2. 对于功能和集成测试,请遵循delayed_job的方法,并提供一种方法来同步完成所有后台工作,例如Delayed::Worker.new.work_off

  3. 您还可以考虑在产生线程或进程时使用EventMachine(如在Any success with Sinatra working together with EventMachine WebSockets?中),尤其是在后台进程是IO密集型的情况下(例如,发出http或数据库请求)。

答案 1 :(得分:0)

以下是我提出的建议:

process_in_background { slow_method }

def process_in_background
  Rails.env == 'test' ? yield : Thread.new { yield }
end

def slow_method
  ...code that takes a long time to run...
end

我喜欢这个解决方案,因为它是透明的:它只是同步地运行 完全相同的代码

有任何建议/问题吗?是否有必要管理僵尸?怎么样?