标签: rspec-sidekiq

为sidekiq工作者编写测试

我正在使用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)

我将他们的低级别测试基于他们的维基上的示例,但它不适合我...任何理由为什么这不起作用?

rspec rspec-rails sidekiq rspec-sidekiq

21
推荐指数
1
解决办法
2万
查看次数

测试Sidekiq收到正确的延迟工作

在我的用户模型中,我正在调用一个延迟方法:

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 ruby-on-rails sidekiq rspec-sidekiq

4
推荐指数
1
解决办法
1543
查看次数

使用RSpec 3测试sidekiq perform_in

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)

ruby rspec sidekiq rspec-sidekiq

4
推荐指数
2
解决办法
5341
查看次数

Sidekiq::测试.假的!不伪造 Sidekiq::Queue

我有一个简单的工作人员正在访问其自己的队列的大小:

需要“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 ruby-on-rails rspec-rails sidekiq rspec-sidekiq

2
推荐指数
1
解决办法
5857
查看次数

如何使用 RSpec 测试 Sidekiq Worker?

我正在使用 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 中进行测试的示例模板吗?

谢谢。

rspec ruby-on-rails rspec-rails sidekiq rspec-sidekiq

2
推荐指数
1
解决办法
8920
查看次数