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)就有问题.
我的问题是:
Class.new(AxeMailer)过AxeMailer我猜这是因为这mailer_class.username 'username'条线而写的。如果您AxeMailer直接使用,该username设置将在测试之间延续。通过为每个测试创建一个新的子类,您可以确保它们之间不会传递任何状态。