我正在使用rspec-sidekiqgem(https://github.com/philostler/rspec-sidekiq)帮助测试我正在编写的工作人员,但出于某种原因,我的测试仍然失败.
这是我的测试:
require 'spec_helper'
describe CommunicationWorker do
it { should be_retryable false }
it "enqueues a communication worker" do
subject.perform("foo@bar.com", "bar@foo.com", [1,2,3])
expect(CommunicationWorker).to have_enqueued_jobs(1)
end
end
Run Code Online (Sandbox Code Playgroud)
这是错误:
1) CommunicationWorker enqueues a communication worker
Failure/Error: expect(CommunicationWorker).to have_enqueued_jobs(1)
expected CommunicationWorker to have 1 enqueued job but got 0
# ./spec/workers/communication_worker_spec.rb:9:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
我将他们的低级别测试基于他们的维基上的示例,但它不适合我...任何理由为什么这不起作用?
在我的用户模型中,我正在调用一个延迟方法:
class User < ActiveRecord::Base
def self.import_items
...
User.delay.keep_only_user_cars(1) # "1" is just for testing
end
end
Run Code Online (Sandbox Code Playgroud)
而我正试图像这样测试它(使用rspec-sidekiq gem):
expect(Sidekiq::Extensions::DelayedClass).to have_enqueued_job("keep_only_user_cars", 1)
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
Failure/Error: expect(Sidekiq::Extensions::DelayedClass).to have_enqueued_job("keep_only_user_cars", 1)
expected to have an enqueued Sidekiq::Extensions::DelayedClass job with arguments ["keep_only_user_cars", 1] but none found
found: [["---\n- !ruby/class 'User'\n- :keep_only_user_cars\n- - 1\n"]]
Run Code Online (Sandbox Code Playgroud)
哪个基本上有效,只是有点不同的格式.
如何修复此测试以确保Sidekiq正好使用此属性接收此方法?
RSpec 3和sidekiq 3.2.1.我已经正确设置了sidekiq和rspec-sidekiq.
假设我有一个叫做的工人WeatherJob,它会将天气状态sunny改为rainy:
class WeatherJob
include Sidekiq::Worker
def perform record_id
weather = Weather.find record_id
weather.update status: 'rainy'
end
end
Run Code Online (Sandbox Code Playgroud)
我像这样使用这个工人:
WeatherJob.perform_in 15.minutes, weather.id.
在规范中,我使用Timecop模拟时间:
require 'rails_helper'
describe WeatherJob do
let(:weather) { create :weather, status: 'sunny' }
let(:now) { Time.current }
it 'enqueue a job' do
expect {
WeatherJob.perform_async weather.id
}.to change(WeatherJob.jobs, :size).by 1
end
context '15 mins later' do
before do
Timecop.freeze(now) do
Weather.perform_in 15.minutes, weather.id
end
end
it 'update to rainy' …Run Code Online (Sandbox Code Playgroud) 我有一个简单的工作人员正在访问其自己的队列的大小:
需要“sidekiq/api”
class TestWorker
include Sidekiq::Worker
def perform(*args)
Sidekiq::Queue.new('test').size
end
end
Run Code Online (Sandbox Code Playgroud)
然后我正在测试这个工人:
require 'rails_helper'
RSpec.describe TestWorker, type: :worker do
describe '#perform' do
it 'executes the job without connecting to Redis in the testing environment' do
require 'sidekiq/testing'
Sidekiq::Testing.fake! do
TestWorker.perform_async
TestWorker.drain
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
此测试失败,因为它尝试访问 redis:
1) TestWorker#perform executes the job without connecting to Redis in the testing environment
Failure/Error: Sidekiq::Queue.new('test').size
Redis::CannotConnectError:
Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
# /home/matthieu/.rvm/gems/ruby-2.4.3/gems/redis-4.0.1/lib/redis/client.rb:344:in `rescue in establish_connection'
# /home/matthieu/.rvm/gems/ruby-2.4.3/gems/redis-4.0.1/lib/redis/client.rb:328:in `establish_connection'
# /home/matthieu/.rvm/gems/ruby-2.4.3/gems/redis-4.0.1/lib/redis/client.rb:99:in …Run Code Online (Sandbox Code Playgroud) 我正在使用 RSPEC 进行测试,并使用 Sidekiq 进行后台作业。
因为 rspec 中没有生成器workers,所以不知道该使用什么。
https://relishapp.com/rspec/rspec-rails/docs/generators
require 'spec_helper'
RSpec.describe TestWorker, type: ? do # ex. :worker :sidekiq ...
describe "TestWorker" do
it "" do
....
end
end
end
Run Code Online (Sandbox Code Playgroud)
bundle exec rspec spec/workers/test_worker_spec.rb
如下所示,我得到:uninitialized constant TestWorker
require 'spec_helper'
describe TestWorker do
it "" do
....
end
end
Run Code Online (Sandbox Code Playgroud)
正如我所尝试的,gem rspec-sidekiq
https://github.com/philostler/rspec-sidekiq
有人可以提供一个用于app/workers/在 Rspec 中进行测试的示例模板吗?
谢谢。