使用 Sinatra 应用程序,发现了 3 种运行后台进程的方法:
Thread.new
Process.fork
Process.spawn
想出了如何让前两个工作,但现在的挑战是测试需要同步运行(有几个原因)。
在生产中异步运行作业但强制测试同步运行的好方法是什么?最好在spec_helper
...中打电话?
Ruby 1.9.3、Sinatra 应用程序、RSpec。
使用 Sinatra 应用程序,发现了 3 种运行后台进程的方法:
Thread.new
Process.fork
Process.spawn
想出了如何让前两个工作,但现在的挑战是测试需要同步运行(有几个原因)。
在生产中异步运行作业但强制测试同步运行的好方法是什么?最好在spec_helper
...中打电话?
Ruby 1.9.3、Sinatra 应用程序、RSpec。
我推荐以下混合方法:
编写简单的单元测试并将您正在测试的内容重构为同步的。换句话说,将所有后台功能放入可以轻松进行单元测试的简单类和方法中。然后后台进程可以调用已经过单元测试的相同功能。您不必对后台线程/进程创建本身进行单元测试,因为这已经在 ruby(或其他库,如god
,bluepill
或Daemons
.
对于功能和集成测试,遵循 的方法delayed_job
并提供一种方法来同步完成所有后台工作,例如Delayed::Worker.new.work_off
您可能还需要考虑使用 EventMachine(如在任何成功与 Sinatra 与 EventMachine WebSockets 一起工作?)而不是产生线程或进程,特别是如果后台进程是 IO 密集型的(例如,发出 http 或数据库请求)。
这是我想出的:
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
我喜欢这个解决方案,因为它是透明的:它运行完全相同的代码,只是同步运行。
有什么建议/问题吗?有必要管理僵尸吗?如何?