测试 Sidekiq 的测试怎么写

xiaoronglv · 2014年01月08日 · 最后由 dfguo 回复于 2014年01月24日 · 6613 次阅读
本帖已被管理员设置为精华贴

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

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

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

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

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