2014-11-21 18 views
8

Cảm ơn bạn trước! Sidekiq đang hoạt động tốt, nhưng tôi không thể kiểm tra nó với Devise Async, hoặc tôi nên nói rằng tôi không thể kiểm tra sau này?Làm thế nào để kiểm tra Devise Async với Sidekiq?

Theo tài liệu của Sidekiq, khi chế độ kiểm tra được đặt thành giả !, bất kỳ công việc nào được cung cấp cho nhân viên đều được chuyển đến một mảng có tên là jobs của cùng một nhân viên đó. Vì vậy, nó là tầm thường để kiểm tra sự gia tăng của mảng này.

Nhưng, với Devise Async, nó không phải là tầm thường, mặc dù phần phụ trợ của nó bao gồm Sidekiq::Worker. Dưới đây là một danh sách nhỏ của những điều mà tôi đã cố gắng để kiểm tra:

  • Devise::Async::Backend::Sidekiq.jobs
  • Devise::Mailer.deliveries
  • ActionMailer::Base.deliveries
  • Devise::Async::Backend::Worker.jobs

Không ai trong số những đối tượng thử nghiệm chỉ sự gia tăng kích thước. Vì Devise gửi các email của nó như là các mô hình gọi lại, tôi đã thử nghiệm cả hai trong một mô hình và trong một đặc tả bộ điều khiển. Sử dụng Factory Girl và Database Cleaner, tôi cũng đã thử cả hai chế độ: giao dịch và cắt xén. Không cần phải nói rằng tôi cũng đã thử cả hai chế độ của Sidekiq: giả! và nội tuyến !.

Tôi đang thiếu gì?

Trả lời

1

Như đã đề cập trong documentation, bạn có thể kiểm tra kích thước hàng đợi như

Sidekiq::Extensions::DelayedMailer.jobs.size 
+0

tôi đã cố gắng rất nhiều điều. Cảm ơn! – kmanzana

0

Được làm việc về vấn đề này, tình cờ gặp một việc thực hiện xinh đẹp được thực hiện bởi gitlab mà tôi nghĩ có thể hữu ích trong việc thử nghiệm devise-async hay email được đẩy qua hàng đợi sidekiq. spec_helper.rb email_helpers.rb

Bằng cách thêm các dòng trong spec_helper.rb

# An inline mode that runs the job immediately instead of enqueuing it 
require 'sidekiq/testing/inline' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

RSpec.configure do |config| 
    config.include EmailHelpers 
    # other configurations line 
end 

Và thêm /spec/support/email_helpers.rb

module EmailHelpers 
    def sent_to_user?(user) 
    ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 
    end 

    def should_email(user) 
    expect(sent_to_user?(user)).to be_truthy 
    end 

    def should_not_email(user) 
    expect(sent_to_user?(user)).to be_falsey 
    end 
end 

Để chạy thử nghiệm ví dụ kiểm tra mật khẩu quên bạn, tôi giả sử bạn biết rspec, factorygirl , capybara /spec/features/password_reset_spec.rb

require 'rails_helper' 

feature 'Password reset', js: true do 
    describe 'sending' do 
    it 'reset instructions' do 
     #FactoryGirl create 
     user = create(:user) 
     forgot_password(user) 

     expect(current_path).to eq(root_path) 
     expect(page).to have_content('You will receive an email in a few minutes') 
     should_email(user) 
    end 
    end 

    def forgot_password(user) 
    visit '/user/login' 
    click_on 'Forgot password?' 
    fill_in 'user[email]', with: user.email 
    click_on 'Reset my password' 
    user.reload 
    end 
end 

Bạn sẽ nhận thấy rằng trong việc thực hiện xét nghiệm này

  1. sẽ gây sidekiq để chạy công việc thay vì enqueuing nó,
  2. Người dùng mô hình email thuộc tính phải được gọi email hoặc bạn chỉ có thể thay thế mã trên.
  3. ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 kiểm tra xem ActionMailer :: Base.deliveries được cung cấp để user.email
Các vấn đề liên quan