Zhi-Qiang Lei
2011-Dec-01 15:14 UTC
ActionMailer: Test failed but works in development environment
http://stackoverflow.com/questions/8339957/actionmailer-test-failed-but-works-in-development-environment The ActionMailer in my Rails 3.1 project has an odd behavior, the ActionMailer::Base.deliveries is empty in test while I can actually receive the email by running the code in rails console. Anybody can points out what wrong it is? # spec/mailers/user_mailer_spec.rb require "spec_helper" describe UserMailer do describe ".reminding_email" do subject { UserMailer.reminding_email(user).deliver } let(:user) { create :confirmed_user_with_mass_tasks } it "should be delivered" do ActionMailer::Base.deliveries.should_not be_empty end its(:to) { should == [user.email] } its(:subject) { should == "Task Reminding" } end end # app/mailers/user_mailer.rb class UserMailer < ActionMailer::Base layout "email" default from: Rails.env.production? ? "<production>@gmail.com" : "<test>@gmail.com" def reminding_email(user) @tasks = user.tasks.reminding_required @current = Time.current mail(to: user.email, subject: "Task Reminding") end end Failures: 1) UserMailer.reminding_email should be delivered Failure/Error: ActionMailer::Base.deliveries.should_not be_empty expected empty? to return false, got true # ./spec/mailers/user_mailer_spec.rb:8:in `block (3 levels) in '' Finished in 11.81 seconds 42 examples, 1 failure, 2 pending # config/environments/test.rb RemindersForMe::Application.configure do # Settings specified here will take precedence over those in config/application.rb # The test environment is used exclusively to run your application''s # test suite. You never need to work with it otherwise. Remember that # your test database is "scratch space" for the test suite and is wiped # and recreated between test runs. Don''t rely on the data there! config.cache_classes = true # Configure static asset server for tests with Cache-Control for performance config.serve_static_assets = true config.static_cache_control = "public, max-age=3600" # Log error messages when you accidentally call methods on nil config.whiny_nils = true # Show full error reports and disable caching config.consider_all_requests_local = true config.action_controller.perform_caching = false # Raise exceptions instead of rendering exception templates config.action_dispatch.show_exceptions = false # Disable request forgery protection in test environment config.action_controller.allow_forgery_protection = false # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test # Use SQL instead of Active Record''s schema dumper when creating the test database. # This is necessary if your schema can''t be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql # Print deprecation notices to the stderr config.active_support.deprecation = :stderr # Setup default URL options as devise needed config.action_mailer.default_url_options = { :host => ''localhost:3000'' } end Application: # config/application.rb require File.expand_path(''../boot'', __FILE__) # Pick the frameworks you want: require "active_record/railtie" require "action_controller/railtie" require "action_mailer/railtie" require "active_resource/railtie" require "sprockets/railtie" # require "rails/test_unit/railtie" if defined?(Bundler) # If you precompile assets before deploying to production, use this line # Bundler.require(*Rails.groups(:assets => %w(development test))) Bundler.require *Rails.groups(:assets) if defined?(Bundler) # If you want your assets lazily compiled in production, use this line # Bundler.require(:default, :assets, Rails.env) end module RemindersForMe class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/extras) # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] # Activate observers that should always be running. # config.active_record.observers = :cacher, :garbage_collector, :forum_observer # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = ''Central Time (US & Canada)'' # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join(''my'', ''locales'', ''*.{rb,yml}'').to_s] # config.i18n.default_locale = :de # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] # Enable the asset pipeline config.assets.enabled = true # Version of your assets, change this if you want to expire all your assets config.assets.version = ''1.0'' # Set Rspec generator as default config.generators do |g| g.test_framework :rspec end # Set Mailer of Devise config.to_prepare do Devise::Mailer.layout "email" end end end Best regards, Zhi-Qiang Lei zhiqiang.lei-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2011-Dec-01 16:55 UTC
Re: ActionMailer: Test failed but works in development environment
On Dec 1, 3:14 pm, Zhi-Qiang Lei <zhiqiang....-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> http://stackoverflow.com/questions/8339957/actionmailer-test-failed-b... > > The ActionMailer in my Rails 3.1 project has an odd behavior, the ActionMailer::Base.deliveries is empty in test while I can actually receive the email by running the code in rails console. Anybody can points out what wrong it is? > > # spec/mailers/user_mailer_spec.rb > require "spec_helper" > > describe UserMailer do > describe ".reminding_email" do > subject { UserMailer.reminding_email(user).deliver } > let(:user) { create :confirmed_user_with_mass_tasks } > it "should be delivered" do > ActionMailer::Base.deliveries.should_not be_empty > endIIRC subject is evaluated lazily, so in this example UserMailer.reminding_email(user).deliver wouldn''t be called at all Fred> its(:to) { should == [user.email] } > its(:subject) { should == "Task Reminding" } > end > end-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.