2015-01-30 4 views
3

I обезьяну исправлена ​​мой класс пользователей (поддержанный по завещанию), чтобы использовать ActiveJob как так:Тестирование Sidekiq/ActiveJob - Работа в ActiveJob но не Sidekiq

class User < ActiveRecord::Base 
    # Omitted 

    def send_devise_notification(notification, *args) 
    devise_mailer.send(notification, self, *args).deliver_later 
    end 
end 

Я попытался тестированием с помощью следующего теста:

class UserTest < ActiveSupport::TestCase 
    include ActiveJob::TestHelper 

    def setup 
    @user = User.new(email: '[email protected]', password: 'password', 
        password_confirmation: 'password') 
    end 

    test 'send_devise_notification queues into activejob' do 
    @user.save 
    assert_equal enqueued_jobs.size, 1 # This test passes 
    assert_equal Sidekiq::Extensions::DelayedMailer.jobs.size, 1 # This test fails 
    end 

журнал/test.log выглядит следующим образом:

------------------------------------------------------------------ 
UserTest: test_0011_send_devise_notification queues into activejob 
------------------------------------------------------------------ 
    [1m[35m (0.1ms)[0m SAVEPOINT active_record_1 
    [1m[36mUser Exists (0.4ms)[0m [1mSELECT 1 AS one FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1[0m 
    [1m[35mUser Load (0.3ms)[0m SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["confirmation_token", "62d1fac8e1319c29bfbe630aece15975963994b09746edbad65772e4598aa4d2"]] 
    [1m[36mSQL (0.4ms)[0m [1mINSERT INTO "users" ("email", "encrypted_password", "created_at", "updated_at", "confirmation_token", "confirmation_sent_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"[0m [["email", "[email protected]"], ["encrypted_password", "$2a$04$b6/WjVWCthq.bKG1KN8JPeb3w8jz8oVWTU53BpTn90wIlTQ5cC2KO"], ["created_at", "2015-01-30 06:19:03.531310"], ["updated_at", "2015-01-30 06:19:03.531310"], ["confirmation_token", "62d1fac8e1319c29bfbe630aece15975963994b09746edbad65772e4598aa4d2"], ["confirmation_sent_at", "2015-01-30 06:19:03.730092"]] 
[ActiveJob] Enqueued ActionMailer::DeliveryJob (Job ID: 9730d5a8-5dd4-4334-8290-e4e8e554715e) to Test(mailers) with arguments: "Devise::Mailer", "confirmation_instructions", "deliver_now", gid://swyp/User/232633312, "s7QVW_T2Aw8-ik6o1g2f", {} 
    [1m[35m (0.2ms)[0m RELEASE SAVEPOINT active_record_1 
    [1m[36m (0.2ms)[0m [1mROLLBACK[0m 
    [1m[35m (0.1ms)[0m BEGIN 

enqueued_jobs внутри отладчик выглядит следующим образом:

[{:job=>ActionMailer::DeliveryJob, 
:args=>["Devise::Mailer", "confirmation_instructions", "deliver_now", #<User id: 232633312, email: "[email protected]", encrypted_password: "$2a$04$E05.gR8oXSHQyk8hUOTBZ.PvswvHy2YYtTNXaha.wj2...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: "cba7134de82b6fde115fd3ca8e40975befeac299a1e619cdcb...", confirmed_at: nil, confirmation_sent_at: "2015-01-30 17:08:51", unconfirmed_email: nil, created_at: "2015-01-30 17:08:51", updated_at: "2015-01-30 17:08:51", first_name: nil, last_name: nil>, "QBLzzPLKVLy3znSZESBc", {}], :queue=>"mailers"}] 

бен/рельсы с --environment тест

irb(main):004:0> Rails.application.config.active_job.queue_adapter 
=> :sidekiq 

Мои PROCFILE выглядит следующим образом:

web: bin/rails s 
redis: redis-server 
worker: bundle exec sidekiq -q default -q mailers 

Кто-нибудь есть какие-нибудь идеи?

ответ

2

ActiveJob::TestHelper фактически не передаёт работу адаптеру. Если вы удалите его, это будет экземпляр ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper.

+0

К сожалению, 'assert_equal ActiveJob :: QueueAdapters :: SidekiqAdapter :: JobWrapper.jobs.size, 1' все еще не работает. Любые другие идеи? – sunnyrjuneja

+0

Майк был прав, что Sidekiq его экземпляр ActiveJob. Тем не менее, оказывается, что «ActiveJob :: TestHelper» не имеет ничего общего с фактическим добавлением чего-либо непосредственно в очередь адаптера. Удаление «ActiveJob :: TestHelper» выполнило второй тестовый проход. Я обновил его ответ, чтобы отразить это. – sunnyrjuneja

+3

Вот что я закончил делать https://medium.com/@chuckjhardy/testing-rails-activejob-with-rspec-5c3de1a64b66 – CharlesJHardy

1

При тестировании адаптера по умолчанию является TestAdapter (см в журналах: [ActiveJob] :: ActionMailer в очереди DeliveryJob (Job ID: 9730d5a8-5dd4-4334-8290-e4e8e554715e) для испытаний (отправители) с аргументами ...).

enqueued_jobs и другие помощники, предоставленные ActiveJob::TestHelper, запрашивают TestAdapter и работают только в том случае, если вы используете TestAdapter при тестировании.

Итак, ваш первый тест проходит, поскольку рабочие места обрабатываются TestAdapter, но ваш второй тест не пройдет, поскольку задания от TestAdapter никогда не достигнут Sidekiq.

+0

Спасибо за разъяснение. Я отметил ответ Майка как решение, потому что, используя его ответ, я смог сначала отладить проблему. Имейте +1, потому что, если бы я увидел ваш ответ первым, это решило бы проблему для меня. – sunnyrjuneja

Смежные вопросы