Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 什么';It’这是本书的新内容_Ruby On Rails_Ruby_Ruby On Rails 3_Rspec - Fatal编程技术网

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)
    over
    AxeMailer
  • 如果我改变这个,有问题吗
  • 有没有办法不改变规格,让它通过

  • 我不知道实际规范中是否使用了
    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$/,'')。下划线
    ,似乎暂时不起作用