ruby-on-rails - Class.new 在这个 Rspec 中有什么好处

标签 ruby-on-rails ruby ruby-on-rails-3 rspec

我正在阅读一些离开公司的人写的 Rspec。我想知道这一行:

  let(:mailer_class) { Class.new(AxeMailer) }
  let(:mailer) { mailer_class.new }

  describe '#check' do
    before do
      mailer_class.username 'username'
      mailer.from 'tester@example.com'
      mailer.subject 'subject'
    end
    subject { lambda { mailer.send(:check) } }

正在测试这个类:

class AxeMailer < AbstractController::Base

  def self.controller_path
    @controller_path ||= name.sub(/Mailer$/, '').underscore
  end

我想知道这和 let(:mailer_class) { AxeMailer } 之间的区别。

我问这个是因为目前当我运行测试时,它会提示 name is nil。但如果我更改它,它会测试正常。

我认为这个问题是在使用 Rails 3.2 之后开始的,我认为 name 是从 AbstractController::Base 继承而来的。

这在控制台中是相同的(这意味着它不是特定于 Rspec 的),我可以毫无错误地执行 AxeMailer.name,但是如果我执行 Class.new(AxeMailer) 有问题。

我的问题是:

  1. 是否有理由使用 Class.new(AxeMailer) 而不是 AxeMailer
  2. 如果我只更改它会有问题吗?
  3. 有没有办法不更改规范并使其通过?

最佳答案

我猜这是因为 mailer_class.username 'username' 行而写的。如果您只是直接使用 AxeMailer,则 username 设置将在测试之间进行。通过为每个测试创建一个新的子类,您可以确保在它们之间不会传递任何状态。

关于ruby-on-rails - Class.new 在这个 Rspec 中有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9681710/

相关文章:

ruby-on-rails - rbenv 无法安装 ruby​​ 版本 1.9.3-p194

ruby-on-rails - 从子类中的重载方法调用基类方法

ruby-on-rails - 为什么我可以将随机代码添加到我的 Ruby 类定义中?

ruby-on-rails - Rails (3) 服务器 - 现在用什么?

ruby-on-rails - 大约 30 个 RoR 应用程序等待(卡住)1 个应用程序启动。这如何解决?

ruby-on-rails - 战俘 : display development log and use Pry?

ruby-on-rails - 将请求头信息传递给app.get

ruby-on-rails - 错误的参数数量(4 个为 5 个)Rails 4.1.14.1

ruby-on-rails - 我应该使用什么数据类型在 Rails 中的 SQLite 中存储大型文本文件和二进制数据

ruby - Rails 3 rake db:migrate 失败,出现 'rake aborted! can' t convert SQLite3::Statement into Array'