ruby-on-rails – Rails Rspec套件出现故障但是单独运行时它们会
事实:
>运行我的整套规范将导致610个规格中的21个一致错误. 这些错误主要是ActionMailer失败,但有些错误. 我目前通过内联运行Rails 4.1.1,Ruby 2.0.0p451,Rspec 2.14.8,Sidekiq! Gemfile(用于测试) group :development,:test do gem 'better_errors' gem 'binding_of_caller' gem 'faker' gem 'guard-rspec' gem 'pry' gem 'rspec-rails' gem 'spork-rails' gem 'sqlite3' gem 'thin' end group :test do gem 'capybara' gem 'capybara-email' gem 'capybara-webkit' gem 'database_cleaner' gem 'fabrication' gem 'launchy' gem 'selenium-webdriver' gem 'shoulda-matchers' gem 'webmock' gem 'vcr' end 请注意,我已经检查了大约十二个类似的问题,这些问题无法解决这个问题.所以,澄清一下: >我没有使用ARGV 为方便起见,也许一些例子会有所帮助: scheduler_spec.rb(显示运行整个套件时失败的测试) require 'spec_helper' require 'rake' require 'sidekiq/testing' Sidekiq::Testing.inline! describe "scheduler",:vcr do describe ":wipe_abandoned_images" do let!(:abandoned_old_image) { Fabricate(:image) } let!(:abandoned_young_image) { Fabricate(:image) } let!(:adopted_image) { Fabricate(:image) } let(:run_cleaner) do Rake::Task[:wipe_abandoned_images].reenable Rake.application.invoke_task :wipe_abandoned_images end before do abandoned_young_image.update_columns(listing_id: nil,updated_at: 6.days.ago) abandoned_old_image.update_columns( listing_id: nil,updated_at: 9.days.ago) Rake.application.rake_require 'tasks/scheduler' Rake::Task.define_task(:environment) #Stub env. Rspec runs the App,so dont want Rake to run it again. end context "for claimed images" do it "leaves the image" do adopted_image_id = adopted_image.id run_cleaner expect(Image.all.count ).to eq(2) expect(Image.find(adopted_image_id) ).to be_present end end end end 请注意,我正在使用Sidekiq的内联!测试先前应用程序的配置,取得了良好的成功.没有这个问题. forgot_passwords_controller_spec.rb(显示运行整个套件时失败的测试) require 'spec_helper' require 'sidekiq/testing' Sidekiq::Testing.inline! describe ForgotPasswordsController do let!(:jen) { Fabricate(:user,email: 'jen@example.com') } describe "POST create" do context "with valid email provided" do before { post :create,email: 'jen@example.com' } after do ActionMailer::Base.deliveries.clear Sidekiq::Worker.clear_all end it 'sends the reset email to the users provided email' do expect(ActionMailer::Base.deliveries.count).to eq(1) end end end end 以下以各种方式运行规范时会发生什么: ForgotPasswordsController规范通过SublimeText2中的RubyTest插件传递
调度程序测试通过SublimeText2中的RubyTest传递
测试通过Console中的rspec传递
运行整套Rspec时测试失败
失败的例子: 有时它有额外的价值
有时它会丢失或不加载值
这是失败的清单 rspec ./spec/controllers/messages_controller_spec.rb:161 # MessagesController POST create message about listing to user from guest with valid information with EXISTING,UN-confirmed guest with EXPIRED token sends another confirmation email with link to the guest rspec ./spec/controllers/messages_controller_spec.rb:114 # MessagesController POST create message about listing to user from guest with valid information with NEW,UN-confirmed,and valid guest email sends an invitation for the guest to be put on safe-email list rspec ./spec/controllers/invitations_controller_spec.rb:30 # InvitationsController POST create with valid email & available invitations sends an email rspec ./spec/controllers/invitations_controller_spec.rb:33 # InvitationsController POST create with valid email & available invitations sends an email to the recipient_email address rspec ./spec/controllers/users_controller_spec.rb:161 # UsersController POST create with invitation token in params with valid token & input confirmation email sending sends the email to the registering user rspec ./spec/controllers/users_controller_spec.rb:158 # UsersController POST create with invitation token in params with valid token & input confirmation email sending sends the email rspec ./spec/controllers/users_controller_spec.rb:164 # UsersController POST create with invitation token in params with valid token & input confirmation email sending sends an email with a confirmation link in the body rspec ./spec/controllers/users_controller_spec.rb:354 # UsersController GET confirm_with_token with valid token has a welcome message in the email rspec ./spec/controllers/users_controller_spec.rb:348 # UsersController GET confirm_with_token with valid token sends a welcome email rspec ./spec/controllers/users_controller_spec.rb:351 # UsersController GET confirm_with_token with valid token sends the welcome email to the user rspec ./spec/controllers/searches_controller_spec.rb:19 # SearchesController GET search GET search with specific category selected returns the matching OR partial-matching table row objects rspec ./spec/controllers/searches_controller_spec.rb:22 # SearchesController GET search GET search with specific category selected only returns values from the selected category rspec ./spec/lib/tasks/scheduler_spec.rb:75 # scheduler :wipe_abandoned_images for abandoned images under 1 week old leaves the image rspec ./spec/lib/tasks/scheduler_spec.rb:68 # scheduler :wipe_abandoned_images for abandoned images over 1 week old deletes the images rspec ./spec/lib/tasks/scheduler_spec.rb:84 # scheduler :wipe_abandoned_images for claimed images leaves the image rspec ./spec/controllers/forgot_passwords_controller_spec.rb:24 # ForgotPasswordsController POST create with valid email provided sets the email subject to notify the user of the reset link rspec ./spec/controllers/forgot_passwords_controller_spec.rb:27 # ForgotPasswordsController POST create with valid email provided sends the link with token in the body of the email rspec ./spec/controllers/forgot_passwords_controller_spec.rb:21 # ForgotPasswordsController POST create with valid email provided sends the reset email to the users provided email rspec ./spec/controllers/reset_passwords_controller_spec.rb:70 # ResetPasswordsController POST create with a valid token sets the email subject to notify the user of the reset password rspec ./spec/controllers/reset_passwords_controller_spec.rb:67 # ResetPasswordsController POST create with a valid token sends a confirmation email to the user that their password has been changed rspec ./spec/controllers/reset_passwords_controller_spec.rb:73 # ResetPasswordsController POST create with a valid token sends the link with token in the body of the email 解决方法
我无法解释造成错误的真正原因.但这必须归功于全局设置Sidekiq测试模式.从规范的head部分删除Sidekiq设置并尝试以下操作:
before do Sidekiq::Testing.inline! do post :create,email: 'jen@example.com' end end after do ActionMailer::Base.deliveries.clear Sidekiq::Worker.clear_all end it 'sends the reset email to the users provided email' do expect(ActionMailer::Base.deliveries.count).to eq(1) end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |