Class.new在这个Rspec中有什么好处

lul*_*ala 5 ruby rspec ruby-on-rails ruby-on-rails-3

我正在阅读一些离开公司的人写的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) } }
Run Code Online (Sandbox Code Playgroud)

它正在测试这个类:

class AxeMailer < AbstractController::Base

  def self.controller_path
    @controller_path ||= name.sub(/Mailer$/, '').underscore
  end
Run Code Online (Sandbox Code Playgroud)

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

我问这个是因为目前在我进行测试时,它会抱怨name为零.但如果我改变它,它将测试很好.

我认为这个问题在使用Rails 3.2之后就开始了,我认为name它继承自AbstractController :: Base.

这在控制台中是相同的(意味着它不是Rspec特定的),我可以做AxeMailer.name没有错误,但如果我这样做Class.new(AxeMailer)就有问题.

我的问题是:

  1. 有没有理由使用Class.new(AxeMailer)AxeMailer
  2. 如果我改变它是否有问题?
  3. 有没有办法不改变规格并让它通过?

Emi*_*ily 2

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