【问题标题】:What should I do to make this rails app testable?我应该怎么做才能使这个 Rails 应用程序可测试?
【发布时间】:2012-10-31 21:02:20
【问题描述】:

我有一个最新的 rails 应用程序,使用带有 mongoid 2 的 rails 3.2。我无法通过键入 rake 开始测试。抛出的异常是(已清理):

rake test                                                                                                                         
/railsapp/app/models/image.rb:18:in `<class:Image>': undefined method `[]' for nil:NilClass (NoMethodError)
    from /railsapp/app/models/image.rb:1:in `<top (required)>'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:251:in `require'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:251:in `block in require'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:236:in `load_dependency'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:251:in `require'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:359:in `require_or_load'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:313:in `depend_on'
    from /gems/activesupport-3.2.8/lib/active_support/dependencies.rb:225:in `require_dependency'
    from /gems/railties-3.2.8/lib/rails/engine.rb:439:in `block (2 levels) in eager_load!'
    from /gems/railties-3.2.8/lib/rails/engine.rb:438:in `each'
    from /gems/railties-3.2.8/lib/rails/engine.rb:438:in `block in eager_load!'
    from /gems/railties-3.2.8/lib/rails/engine.rb:436:in `each'
    from /gems/railties-3.2.8/lib/rails/engine.rb:436:in `eager_load!'
    from /gems/railties-3.2.8/lib/rails/application/finisher.rb:53:in `block in <module:Finisher>'
    from /gems/railties-3.2.8/lib/rails/initializable.rb:30:in `instance_exec'
    from /gems/railties-3.2.8/lib/rails/initializable.rb:30:in `run'
    from /gems/railties-3.2.8/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /gems/railties-3.2.8/lib/rails/initializable.rb:54:in `each'
    from /gems/railties-3.2.8/lib/rails/initializable.rb:54:in `run_initializers'
    from /gems/railties-3.2.8/lib/rails/application.rb:136:in `initialize!'
    from /gems/railties-3.2.8/lib/rails/railtie/configurable.rb:30:in `method_missing'
    from /railsapp/config/environment.rb:7:in `<top (required)>'
    from /railsapp/test/test_helper.rb:2:in `require'
    from /railsapp/test/test_helper.rb:2:in `<top (required)>'
    from /railsapp/test/unit/post_test.rb:1:in `require'
    from /railsapp/test/unit/post_test.rb:1:in `<top (required)>'
    from /gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:10:in `require'
    from /gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:10:in `block (2 levels) in <main>'
    from /gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:9:in `each'
    from /gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:9:in `block in <main>'
    from /gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:4:in `select'
    from /gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:4:in `<main>'
Errors running test:units! #<RuntimeError: Command failed with status (1): [/Users/janlimpens/.rvm/rubies/ruby-1.9.3-p...]>

我用上下文中感兴趣的文件创建了一个要点: https://gist.github.com/3989760

根本没有关于图像模型的测试,没有固定装置,我得到的唯一测试包含在 gist 中,但这不是罪魁祸首,错误是在包含 test_helper.rb 时引发的。

我有什么选择?

【问题讨论】:

    标签: ruby-on-rails ruby tdd activesupport


    【解决方案1】:

    当测试开始 Rails 加载时,它会评估你的所有模型。

    这包括 Image 模型,它在第 18 行显然有错误或错字。

    这是哪一行:

    :path => "#{APP_CONFIG['uploads_dir']}/:class/:id/:attachment/:style.:extension",
    

    这里唯一的数组表示法是:

    APP_CONFIG['uploads_dir']
    

    那么,APP_CONFIG 是在哪里定义的呢?为什么它是零?这些是我们必须回答的问题。

    您可以从 grepping 项目中获取此字符串开始。

    【讨论】:

    • 我在很多地方都使用它。这来自初始化程序将 yaml 文件读入全局:APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
    • 但是您的假设似乎是正确的,我删除了带有参考的行,我仅从使用此文件的下一个文件中获得异常。也许在检查时这些初始化程序还没有运行……
    • 您的 config.yml 中是否有用于 test 环境的部分?也许你忘了定义它,或者它的定义不正确。
    • 不,它应该可以很好地加载 - 我认为它与初始化顺序有关。我从模型中删除了造成影响的字符串,现在所有测试都通过了:)
    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多