ruby-on-rails - 类型错误 : superclass mismatch for class Task

标签 ruby-on-rails ruby rspec rake travis-ci

我有一个 Rails 项目并使用 RSpec 进行测试。最近,我在我的 spec_helper.rb 中添加了这个:

config.before(:suite) do
  Rails.application.load_tasks
end

如果我使用 bundle exec rspec 在本地运行测试,一切都很好。但是当我尝试在 Travis CI 上做同样的事情时,命令崩溃了:

TypeError: superclass mismatch for class Task
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:9:in `<module:Rails>'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:8:in `<module:Sprockets>'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:7:in `<top (required)>'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.9/lib/active_support/dependencies.rb:274:in `require'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.9/lib/active_support/dependencies.rb:274:in `block in require'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.9/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.9/lib/active_support/dependencies.rb:274:in `require'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/sprockets-rails-3.2.1/lib/sprockets/railtie.rb:163:in `block in <class:Railtie>'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:237:in `instance_exec'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:237:in `block in run_tasks_blocks'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:245:in `each'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:245:in `each_registered_block'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:237:in `run_tasks_blocks'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/application.rb:451:in `block in run_tasks_blocks'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/engine/railties.rb:13:in `each'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/engine/railties.rb:13:in `each'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/application.rb:451:in `run_tasks_blocks'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/engine.rb:453:in `load_tasks'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:194:in `public_send'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/railtie.rb:194:in `method_missing'
    from (irb):25
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/commands/console.rb:110:in `start'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/commands/console.rb:9:in `start'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /home/travis/build/my_application/vendor/bundle/ruby/2.3.0/gems/railties-4.2.9/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

如果我调试 Travis 构建并手动启动 bundle exec rails c 并执行 Rails.application.load_tasks,也会发生同样的事情。

这可能是什么问题?任何线索将不胜感激!

最佳答案

TypeError: superclass mismatch 发生在您重新打开一个类并尝试为其重新定义父类(super class)时。这是强制出现此错误的一种方法:

class A; end
class B < A; end
class C; end
class B < C; end # raises error

因为这只发生在 Travis 环境中,所以如果可能的话我会在那里调试它:

  • 用vim nano 或类似的 CLI 编辑器
  • 要求“ pry ”; binding.pry,在导致错误的行之上
  • 捆绑安装
  • 重新运行您的测试代码
  • 进入调试器并检查 Task 来自哪里。由于您收到 TypeError: superclass mismatch,因此 Task 必须在重新打开它的这一行之前定义。 show-source Task 应该会显示它的定义位置。

关于ruby-on-rails - 类型错误 : superclass mismatch for class Task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472997/

相关文章:

ruby - 您是否已将 makefile 替换为 ruby​​ 脚本?

Ruby:使用 Mechanize 访问我的表单时出现问题!

ruby-on-rails - 失败/错误:在 { visit signup_path } 之前 NameError:#<RSpec::Core::ExampleGroup 的未定义局部变量或方法 `signup_path'

ruby-on-rails - 从Docker导出RSpec测试

ruby-on-rails - ActiveRecord:清理 `select` 或 `order` 调用中的动态值

ruby-on-rails - Rails 3.0 中的奇怪路由错误

ruby - 使用 Rubyzip 压缩现有文件

ruby - 在具有组合因素的 RSpec 中组织测试的最佳方法

ruby-on-rails - Rails 模型命名部分首字母缩写词

ruby-on-rails - Ruby on Rails与Oracle Objects(以及一般面向对象的数据持久性)