命名空间中的Rspec测试失败

时间:2010-12-20 20:29:51

标签: ruby-on-rails ruby rspec rspec2

我刚刚将一些现有的rails测试转换为rspec,现在命名空间中的测试失败了。

即。在下面的示例中,AccountController规范传递,而ChildrenController失败并出现以下错误:

in `load_missing_constant': Expected /.../app/controllers/admin/children_controller.rb to define Admin::ChildrenController (LoadError)

应用程序/控制器/ account_controller.rb

class AccountController < ApplicationController

规格/控制器/ account_controller_spec.rb

require 'spec_helper'

describe AccountController do
  #...
end

应用程序/控制器/管理/ children_controller.rb

class Admin::ChildrenController < ApplicationController

规格/控制器/管理/ children_controller_spec.rb

require 'spec_helper'

describe Admin::ChildrenController do  
   include ::ControllerHelper 
   #... 
end

我正在使用

  • 红宝石1.9.2-P0
  • Rails 3.0.3
  • rspec 2.3.0

我尝试过使用命名空间定义,但到目前为止没有运气 - 任何想法???

5 个答案:

答案 0 :(得分:3)

另一种解决方案:

通过将类定义为字符串,它将正常加载:

# children_controller_spec.rb
require 'spec_helper'
describe "Admin::ChildrenController" do  
  # -something-
end

这将在spec / controller / admin目录中运行

编辑:在2.10.x中无效

答案 1 :(得分:3)

我遇到了同样的问题,并且不愿意将测试放在较低的目录中。在我的情况下,Spork正在搞乱事情。

确切地说:

Spork.each_run do
  ActiveSupport::Dependencies.clear
end

如果spork正在运行,我会放置一个检查器,否则你应该忽略这一行。

Spork.each_run do
  if /spork/i =~ $0 || RSpec.configuration.drb?
    ActiveSupport::Dependencies.clear
  end
end

答案 2 :(得分:2)

我遇到了同样的问题,并通过以下方式解决了这个问题:

在:

# app/controllers/admin/awards_controller.rb:
class Admin::AwardsController < ApplicationController

# spec/controllers/admin/awards_controller_spec.rb:
require 'spec_helper'

describe Admin::AwardsController do

跑步rspec给了我:

/Users/andy/.rvm/gems/ruby-1.9.3-p385@xxxx/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:503:in `load_missing_constant': Expected /Volumes/untitled/xxxx/app/controllers/admin/awards_controller.rb to define Admin::AwardsController (LoadError)
(stacktrace...)

后:

# spec/controllers/admin/awards_controller_spec.rb:
require 'spec_helper'
load "#{Rails.root}/app/controllers/admin/awards_controller.rb"

describe Admin::AwardsController do

答案 3 :(得分:1)

发布答案以防万一有人偶然发现这一次!

最后,我通过扁平化规格来修复它,如下所示:

app>controllers>admin>children_controller.rb
class Admin::ChildrenController < ApplicationController

spec>controllers>children_controller_spec.rb
require 'spec_helper'
describe Admin::ChildrenController do  

答案 4 :(得分:0)

您可以将控制器保存在单独的文件夹中,但必须使用 要求File.dirname(文件)+'/../../ speclhelper' 而不是只需要'spec_helper'