【发布时间】:2012-03-14 01:55:19
【问题描述】:
我正在阅读一些离开公司的人写的 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 - 如果我只是改变这个有问题吗?
- 有没有办法不更改规范并使其通过?
【问题讨论】:
-
除了
let方法之外,你能发布更多的测试代码吗?这将帮助我们确定为什么要这样写。 -
刚刚加了一些,够吗?
-
Class.new(AxeMailer)创建一个继承自 AxeMailer 的未命名类。不过,不喜欢这里需要它。 apidock.com/ruby/Class/new/class -
谢谢,所以我猜这基本上是在你想测试类继承时使用的?行为不同是否有原因?
标签: ruby-on-rails ruby ruby-on-rails-3 rspec