Ruby on rails 什么';It’这是本书的新内容
我正在读一些离开公司的人写的简历。我想知道这一行:Ruby on rails 什么';It’这是本书的新内容,ruby-on-rails,ruby,ruby-on-rails-3,rspec,Ruby On Rails,Ruby,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 'subj
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
class-AxeMailer
我想知道这与let(:mailer_class){AxeMailer}
之间的区别
我这样问是因为当前运行测试时,它会抱怨name
为nil。但是如果我改变了它,它会测试的很好
我认为这个问题是在使用Rails 3.2之后开始的,我认为name
是从AbstractController::Base继承的
在控制台中也是如此(这意味着它不是特定于Rspec的),我可以执行AxeMailer.name
操作,但如果执行Class.new(AxeMailer)
操作,则会出现问题
我的问题是:
Class.new(AxeMailer)
overAxeMailer
我不知道实际规范中是否使用了
mailer\u class
,但我认为您的设置应该是这样的:
let(:mailer) { AxeMailer.new }
describe '#check' do
before do
AxeMailer.username 'username'
mailer.from 'tester@example.com'
mailer.subject 'subject'
end
subject { lambda { mailer.send(:check) } }
似乎不需要创建匿名类。另外,这只是我的观点,但是你的主题
看起来有点奇怪。如果需要,您的规范可能应该将主题包装在lambda中,但不要在主题中这样做
关于最初看到的错误,匿名类没有名称:
1.9.3-p0 :001 > Class.new.name
=> nil
ActionMailer::Base的某些部分必须尝试将类名用于某些内容(可能是日志记录),当类名为空时会中断。我猜它是编写的,这是因为mailer\u class.username'username'
行。如果您只是直接使用AxeMailer
,那么username
设置将在测试之间进行。通过为每个测试创建一个新的子类,您可以确保它们之间没有状态转移。除了let
方法之外,您可以发布更多的测试代码吗?这将有助于我们确定它为何以这种方式编写。只添加了一些,这样就足够了吗?Class.new(AxeMailer)
创建一个从AxeMailer继承的未命名类。但我不喜欢这里需要它。谢谢,所以我想这基本上是用来测试类继承的?这种行为不同有什么原因吗?谢谢。名称
用于方法self.controller\u路径
。它正在覆盖AbstractController::Base
的self.controller\u路径
。因为它是一种新的AbstractController::Base
,所以它应该也能工作(并且以前一直在工作)。我认为这可能就是原因(无论如何,这并不重要)。我将其修改为:@controller_path | |=parent.name.sub(/Mailer$/,'')。下划线
,似乎暂时不起作用