我正在阅读一些离开公司的人写的 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)
有问题。
我的问题是:
- 是否有理由使用
Class.new(AxeMailer)
而不是AxeMailer
- 如果我只更改它会有问题吗?
- 有没有办法不更改规范并使其通过?
最佳答案
我猜这是因为 mailer_class.username 'username'
行而写的。如果您只是直接使用 AxeMailer
,则 username
设置将在测试之间进行。通过为每个测试创建一个新的子类,您可以确保在它们之间不会传递任何状态。
关于ruby-on-rails - Class.new 在这个 Rspec 中有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9681710/