gpt4 book ai didi

ruby-on-rails - ActionMailer:测试失败但在开发环境中有效

转载 作者:行者123 更新时间:2023-12-04 03:43:12 26 4
gpt4 key购买 nike

我的 Rails 3.1 项目中的 ActionMailer 有一个奇怪的行为,ActionMailer::Base.deliveries 在测试中是空的,而我实际上可以通过在 rails 控制台中运行代码来接收电子邮件。谁能指出这是什么问题?

# 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

失败:

1) 应该发送 UserMailer.reminding_email 失败/错误:ActionMailer::Base.deliveries.should_not be_empty 预计空?返回假,得到真 # ./spec/mailers/user_mailer_spec.rb:8:in `block (3 levels) in '

在 11.81 秒内完成42 个示例,1 个失败,2 个待处理

# 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

应用:

# 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

现在更改规范如下:

require "spec_helper"

describe UserMailer do
describe ".reminding_email" do
subject { UserMailer.reminding_email(user) }
let(:user) { create :confirmed_user_with_undue_tasks }
it { expect { subject.deliver }.to change { ActionMailer::Base.deliveries.length }.by(1) }
its(:to) { should == [user.email] }
its(:subject) { should == "Task Reminding" }
end
end

1) UserMailer.reminding_email 失败/错误:它 { 期望 { subject.deliver }.to 更改 { ActionMailer::Base.deliveries.length }.by(1) } 结果应该被改变了1,但被改变了2 # ./spec/mailers/user_mailer_spec.rb:7:in `block (3 levels) in '

最佳答案

我遇到了类似的问题,因为我正在测试 Devise 电子邮件:Devise 使用单独的邮件程序,因此您需要访问 Devise.mailer.deliveries 而不是 ActionMailer: :Base.deliveries.

关于ruby-on-rails - ActionMailer:测试失败但在开发环境中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com