测试 Sidekiq 的测试怎么写

xiaoronglv · 2014年01月08日 · 最后由 dfguo 回复于 2014年01月24日 · 4615 次阅读
本帖已被设为精华帖!

今天第一次给异步任务写测试,顺手把官方文档翻译了一下。

一 官方文档提供了三种测试模式

require 'sidekiq/testing'
Sidekiq::Testing.fake!
Sidekiq::Testing.inline!
Sidekiq::Testing.disable!

1. Sidekiq::Testing.fake!(不用redis)

在test文件的头部添加这段代码后,若test case中有异步任务,sidekiq不会将异步任务保存在redis中,而是保存在一个数组 jobs 中。

require 'sidekiq/testing'
Sidekiq::Testing.fake!

test case 范例

# jobs中的异步任务数为0
assert_equal 0, HardWorker.jobs.size
HardWorker.perform_async(1, 2)

# jobs中的异步任务数为1
assert_equal 1, HardWorker.jobs.size

使用drain方法,可以执行所有的异步任务

# 生成2个异步任务
HardWorker.perform_async(1, 2)
HardWorker.perform_async(2, 3)
assert_equal 2, HardWorker.jobs.size

# 执行所有异步任务
HardWorker.drain

# 异步任务总数为0
assert_equal 0, HardWorker.jobs.size

如果不打算执行,只想清空jobs,可以使用clear方法

# 生成异步任务
HardWorker.perform_async(1, 2)

# 清空jobs中的所有异步任务
HardWorker.jobs.clear

assert_equal 0, HardWorker.jobs.size

2. Sidekiq::Testing.inline!(同步执行)

在test文件的头部添加这段代码后,若test case中有异步任务,都会修改为同步执行。

require 'sidekiq/testing'
Sidekiq::Testing.inline!

3. Sidekiq::Testing.disable!(禁用所有异步任务)

在test文件的头部添加这段代码后,若test case中有异步任务,都会跳过。

require 'sidekiq/testing'
Sidekiq::Testing.disable!

二 直接测试worker

可以直接创建一个worker对象,然后执行。

work = HardWorker.new
work.perform(1, 2)

三 Reference

  1. sidekiq Testing
共收到 2 条回复

good job

不喜欢用第一种方式测试,因为这个测试并没有保证传给sidekiq的参数是否正确。我一般用这个sidekiq-rspec gem做测试。这个gem支持测试传给sidekiq参数是否正确:

Awesomejob.perform_async "Awesome", true
# test with...
expect(AwesomeJob).to have_enqueued_job("Awesome", true)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册