我正在阅读一些由已离职的人编写的 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
为空。但如果我更改它,测试就能通过。
我认为这个问题始于使用Rails 3.2,并且我认为name
是从AbstractController::Base继承来的。
在控制台中也是如此(意味着不是Rspec特定的),我可以毫无错误地执行AxeMailer.name
,但是如果我执行Class.new(AxeMailer)
,就会出现问题。
我的问题是:
- 为什么要使用
Class.new(AxeMailer)
而不是AxeMailer
? - 如果我只是更改这个,是否存在问题?
- 有没有一种方法可以不更改规范而使其通过?
let
方法之外,再发布更多的测试代码吗?这将有助于我们确定为什么要以这种方式编写它。 - Derek HarmelClass.new(AxeMailer)
创建了一个未命名的类,继承自AxeMailer。虽然这里好像不需要它。http://apidock.com/ruby/Class/new/class - besen