我正在阅读一些离开公司的人写的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'
行而写的。如果您只是直接使用AxeMailer
,username
设置将在测试之间进行。通过为每个测试创建一个新的子类,可以确保它们之间没有任何状态。
关于ruby-on-rails - 此Rspec中Class.new的好处是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9681710/