1

我为我的应用程序的基于设计的身份验证编写了以下集成测试:

# password_resets_spec.rb

require 'spec_helper'

describe "PasswordResets" do
  it "emails user when requesting password reset" do
    user = FactoryGirl.create(:user)
    reset_email # or else we'll have the confirmation email in the last assertion
    visit new_user_session_path
    click_link "password"
    fill_in "Email", with: user.email
    click_button "Send"
    current_path.should eq(new_user_session_path)
    page.should have_content "Will receive"
    last_email.to.should include(user.email)
  end

  it "doesn't email invalid user when requesting password reset" do
    user = FactoryGirl.create(:user)
    reset_email # or else we'll have the confirmation email in the last assertion
    visit new_user_session_path
    click_link "password"
    fill_in "Email", with: 'nobody@example.com'
    click_button "Send"
    current_path.should eq(user_password_path)
    page.should have_content "correct"
    last_email.should be_nil
  end
end

和:

# registers_spec.rb

require 'spec_helper'

describe "Registers" do
  it "should inform the user to confirm account" do
    user = FactoryGirl.build(:user)
    visit new_user_registration_path
    fill_in "Username", with: user.username
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    fill_in "Confirm password", with: user.password
    click_button "Send"
    current_path.should eq(root_path)
    page.should have_content "You have been sent"
    last_email.to.should include(user.email)
  end
end

我正在将 Sidekiq 用于后台作业,last_email并且reset_email来自以下模块:

module MailerMacros
  def last_email
    ActionMailer::Base.deliveries.last
  end

  def reset_email
    ActionMailer::Base.deliveries.clear
  end
end

在 User 模型上停用 devise-async 时,所有这三个规范都可以正常工作。当我打开它时,密码重置规范运行正常,但注册者抱怨 last_email 为零,我不明白为什么。与密码重置邮件相比,发送的确认邮件是否有所不同?

请注意,我的require 'sidekiq/testing/inline'spec_helper.rb 文件中有该行,以便立即完成电子邮件发送并config.action_mailer.delivery_method = :test为我的测试环境设置,因此不会发生实际的电子邮件发送。

4

1 回答 1

3

我已经通过 mhfs 的帮助解决了这个问题。问题是我已经config.use_transactional_fixtures设置为 truespec_helper.rb并且因为这个用户是在事务中创建的,并且发送电子邮件的 after_commit 钩子从未被调用过。密码重置显然没有在交易中运行,这就是它们起作用的原因。

所以我不得不关闭 use_transactional_fixtures 并使用database_cleaner来保持我的数据库整洁。

这是我必须修改的内容:

添加gem 'database_cleaner'到我的Gemfile.

显然修改spec_helper.rb

config.use_transactional_fixtures = false

将以下内容添加到spec_helper.rb

config.before(:each) do
  with_transaction_callbacks = example.metadata[:with_transaction_callbacks]
  if with_transaction_callbacks
    DatabaseCleaner.strategy = :truncation
  else
    DatabaseCleaner.strategy = :transaction
  end
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

最后重做我的块registers_spec.rb以阅读:

describe "Registers" do
  it "should inform the user to confirm account", with_transaction_callbacks: true do
    [ --- 8< snip --- ]
  end
end

魔术发生在第二行。

PS。这个Stack Overflow 主题以及其中链接的文章也有帮助。

于 2013-05-24T15:24:46.123 回答