通过rake运行rspec测试时,在装饰器内获取未初始化的常量(NameError)

时间:2013-08-13 00:39:14

标签: ruby-on-rails-3 rspec rake decorator rspec-rails

在我的应用程序中,我使用了一个引擎(blogit),我想添加一些更改/行为。

我按照指南介绍了如何覆盖引擎控制器/模型,并添加了以下内容:

代码

config/initializer/blogit.rb

# Requires extension ruby files in lib/blogit.
Dir[Rails.root.join("lib/blogit/*.rb")].each {|f| require f}

lib/blogit/engine.rb

module Blogit
  class Engine < ::Rails::Engine
    isolate_namespace Blogit

    config.to_prepare do
      Dir.glob(Rails.root + "app/decorators/**/blogit/*_decorator*.rb").each do |c|
        require_dependency(c)
      end
    end
  end
end

app/decorators/controllers/blogit/comments_controller_decorator.rb

Blogit::CommentsController.class_eval do
  def create
    Rails.logger.info "decorated controller action"
    # ... overridden stripped ...
  end
end

app/decorators/models/blogit/comment_decorator.rb

Blogit::Comment.class_eval do
  belongs_to :user
end

待提及:

  • 我还创建了一个迁移,以便为评论模型添加用户引用,因为我的应用程序使用了设计,我只希望logged_in用户能够发表评论。 (因此我不需要标准行为,因此我将覆盖它。)

问题

如果我运行rake,我会收到奇怪的错误:

/Users/Kassi/.rvm/rubies/ruby-1.9.3-p392-railsexpress/bin/ruby -S rspec ./spec/controllers/home_controller_spec.rb ./spec/models/user_spec.rb
/Users/Kassi/demo/app/decorators/controllers/blogit/comments_controller_decorator.rb:3:in `<top (required)>': uninitialized constant Blogit::CommentsController (NameError)

但是,如果我运行rake手动提及的第一行(.../ruby -S ...),则所有测试都正在成功运行。

在我的项目中,我正在使用 guard spork 。跑卫也会让测试通过而没有任何错误。

应用程序本身运行良好,即它启动没有错误,我可以按我的意愿发表评论。我的装饰者动作代码正在执行。

运行 rake 时有什么不同? 为什么会破坏?

注意:

  • 添加require "blogit"require "blogit/comments_controller"无济于事。它实际上无法使用 require 找到控制器。

演示应用程序

由于这个问题是一个更大的项目的一部分,我从头开始创建一个新的应用程序用于测试,只包含相关的东西:基本的rails应用程序,rspec,设计,blogit和装饰器。 它可以在这里找到:https://github.com/kassi/decorator_demo_rspec(git://github.com/kassi/decorator_demo_rspec.git)

另一个使用testunit(工作正常!)的repo可以在这里找到:https://github.com/kassi/decorator_demo_testunit(git://github.com/kassi/decorator_demo_testunit.git)

1 个答案:

答案 0 :(得分:0)

您可以尝试activesupport-decorators为您执行此操作,而不是自己执行require语句。