【问题标题】:What's the benefit of Class.new in this Rspec这个 Rspec 中 Class.new 的好处是什么
【发布时间】:2012-03-14 01:55:19
【问题描述】:

我正在阅读一些离开公司的人写的 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. 有没有办法不更改规范并使其通过?

【问题讨论】:

  • 除了let 方法之外,你能发布更多的测试代码吗?这将帮助我们确定为什么要这样写。
  • 刚刚加了一些,够吗?
  • Class.new(AxeMailer) 创建一个继承自 AxeMailer 的未命名类。不过,不喜欢这里需要它。 apidock.com/ruby/Class/new/class
  • 谢谢,所以我猜这基本上是在你想测试类继承时使用的?行为不同是否有原因?

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


【解决方案1】:

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

【讨论】:

  • 我认为这可能是原因(无论如何这并不重要)。我将其修改为:@controller_path ||= parent.name.sub(/Mailer$/, '').underscore,现在似乎通​​过了
【解决方案2】:

我不知道mailer_class 是否在实际规范中使用,但我认为您的设置应该是这样的:

let(:mailer) { AxeMailer.new }

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

似乎不需要正在创建的匿名类。此外,这只是我的意见,但您的 subject 看起来有点奇怪。如果需要,您的规范可能应该将主题包装在 lambda 中,但不要在 subject 中这样做。

关于您最初看到的错误,匿名类没有名称:

1.9.3-p0 :001 > Class.new.name
 => nil 

ActionMailer::Base 的某些部分必须尝试将类名用于某些事情(可能是记录)并在它为 nil 时中断。

【讨论】:

  • 谢谢。 name 用于方法self.controller_path。它覆盖了AbstractController::Baseself.controller_path。由于它是一种新的AbstractController::Base,它应该也可以工作(并且以前一直在工作)。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多