【问题标题】:Rails: Old, non-existant database table causes tests to errorRails:旧的、不存在的数据库表导致测试出错
【发布时间】:2011-06-03 12:22:11
【问题描述】:

我一直在尝试在我最近负责的 Rails 应用程序中运行“真实”单元测试 mac_test.rb。它看起来像这样:

    require 'test_helper'

    class MacTest < ActiveSupport::TestCase
      # Replace this with your real tests.
      test "the truth" do
        assert true
      end
    end

我已经运行了rake db:test:prepare,我正在尝试使用ruby -I test test/unit/mac_test.rb 运行测试。

但是,我得到以下简短的错误输出:

    Loaded suite test/unit/mac_test
    Started
    EEEEEEEEEEEEEEE
    Finished in 0.377261 seconds.

      1) Error:
    test_datas(ActionController::IntegrationTest):
    ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: vendors: DELETE FROM "vendors" WHERE 1=1


      2) Error:
    testjigs(ActionController::IntegrationTest):
    ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: vendors: DELETE FROM "vendors" WHERE 1=1


      3) Error:
    test_datas(ActionController::TestCase):
    ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: vendors: DELETE FROM "vendors" WHERE 1=1

    <more errors here>

    15 tests, 0 assertions, 0 failures, 15 errors

所有 15 个错误都与前三个类似 - 它们抱怨缺少供应商表。供应商显然曾经存在 - 有一些剩余文件,如 vendor_helper 并且在 routes.rb 文件中还有一个map.resources :vendor。我已经删除了旧的供应商文件并删除了 map.resources :vendor 行。

因此没有模型、视图、控制器、测试、数据库表或任何名为 vendor/vendors 的东西。使用 TextMate 在项目(不区分大小写)中搜索“供应商”,只有一次出现的“供应商”不在注释、日志文件、自述文件或 boot.rb 文件中,那是在 Capfile 中。 (我认为这不会影响测试?)

我尝试使用rake db:reset 来查看它是否是一些奇怪的数据库问题,但它仍在爆炸。

如果我尝试使用rake test:units --trace,(只是为了获取跟踪,我不知道如何通过单独的测试获取跟踪)我得到缩写输出:

    ** Invoke test:units (first_time)
    ** Invoke db:test:prepare (first_time)
    ** Invoke db:abort_if_pending_migrations (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    ** Execute db:abort_if_pending_migrations
    ** Execute db:test:prepare
    ** Invoke db:test:load (first_time)
    ** Invoke db:test:purge (first_time)
    ** Invoke environment 
    ** Execute db:test:purge
    ** Execute db:test:load
    ** Invoke db:schema:load (first_time)
    ** Invoke environment 
    ** Execute db:schema:load
    ** Execute test:units
    /usr/local/bin/ruby -I"lib:test" "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/auth_code_test.rb" "test/unit/cal_data_test.rb" "test/unit/calibration_test.rb" "test/unit/helpers/auth_codes_helper_test.rb" "test/unit/helpers/jn_macs_helper_test.rb" "test/unit/jn_mac_test.rb" "test/unit/log_entry_test.rb" "test/unit/mac_test.rb" "test/unit/option_test.rb" "test/unit/q_test_test.rb" "test/unit/serial_test.rb" "test/unit/source_test.rb" "test/unit/test_data_test.rb" "test/unit/testjig_test.rb" 
    Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader
    Started
    EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
    Finished in 1.06271 seconds.

      1) Error:
    test_datas(ActionController::IntegrationTest):
    ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: vendors: DELETE FROM "vendors" WHERE 1=1

    <more similar errors>

    52 tests, 0 assertions, 0 failures, 52 errors
    rake aborted!
    Command failed with status (1): [/usr/local/bin/ruby -I"lib:test" "/usr/loc...]
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:995:in `sh'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1010:in `call'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1010:in `sh'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1094:in `sh'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1029:in `ruby'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1094:in `ruby'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/testtask.rb:117:in `define'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1112:in `verbose'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/testtask.rb:102:in `define'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
    /usr/local/lib/ruby/1.8/monitor.rb:242:in `synchronize'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run'
    /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake:31
    /usr/local/bin/rake:19:in `load'
    /usr/local/bin/rake:19

我不知道如何让它不爆炸。谁能帮我找到一种方法让 Rails 意识到不应该再有任何“供应商”?

编辑:我正在使用 Rails 2.3.2 和 ruby​​ 1.8.7(2009-06-12 补丁级别 174)[i686-darwin9.7.0]

【问题讨论】:

    标签: ruby-on-rails unit-testing


    【解决方案1】:

    检查测试文件夹中是否有名为 vendor.yml 的固件文件。如果它在那里并且您没有供应商表,那么您会收到这些错误,因为默认情况下,Rails 会尝试使用该文件中的数据填充您的供应商表。

    【讨论】:

    • 我删除了 vendor.yml 文件并修复了它,谢谢!我原以为 TextMate 在进行项目范围的搜索时会包含文件名,但我猜不是。
    • @Brian 帮了大忙! ...这让我发疯了。
    【解决方案2】:

    您的 {RAILS_ROOT}/db/schema.rb 文件中可能仍有一些关于先前供应商表的信息。该文件中的信息用于构建测试环境。如果它确实包含供应商表信息,您可以运行 rake db:schema:dump 来刷新该文件,然后再次尝试您的测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 2019-01-20
      • 1970-01-01
      • 2019-09-05
      • 2023-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多