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

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

  describe '#check' do
    before do
      mailer_class.username 'username'
      mailer.from '[email protected]'
      mailer.subject 'subject'
    end
    subject { lambda { mailer.send(:check) } }

它正在测试此类:
class AxeMailer < AbstractController::Base

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

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

我问这个问题是因为当前运行测试时,它会提示name为nil。但是,如果我更改了它,它会很好地测试。

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

在控制台中这是相同的(意味着它不是特定于Rspec的),我可以正确执行AxeMailer.name,但是如果我执行Class.new(AxeMailer)则存在问题。

我的问题是:
  • 是否有理由在Class.new(AxeMailer)上使用AxeMailer
  • 如果我仅更改此设置,是否有问题?
  • 有没有办法不更改规范并使其通过?
  • 最佳答案

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

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

    10-13 04:51