我为我的应用程序的基于设备的身份验证编写了以下集成测试:
# 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
在用户模型上停用devise-async时,所有这三个规范都可以正常工作。当我打开它时,密码重置规格运行正常,但寄存器抱怨last_email为零,我不明白为什么。与密码重置密码相比,确认邮件的发送方式有何不同?
请注意,我的spec_helper.rb文件中有require 'sidekiq/testing/inline'
行,以便即时完成电子邮件发送,并为我的测试环境设置config.action_mailer.delivery_method = :test
,以便不会发送实际的电子邮件。
答案 0 :(得分:3)
我已经用mhfs'help解决了这个问题。问题是我在config.use_transactional_fixtures
中将spec_helper.rb
设置为true,因此用户是在事务中创建的,并且从未调用过发送电子邮件的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。 This Stack Overflow主题以及从其中链接的the article也有帮助。