Rails: старая несуществующая таблица базы данных приводит к ошибкам тестов - PullRequest
11 голосов
/ 03 июня 2011

Я пытался запустить «правдивый» модульный тест mac_test.rb в приложении Rails, за которое я недавно отвечал. Это выглядит так:

    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, а также файл map.resources :vendor в файле rout.rb. Я удалил старые файлы поставщика и удалил map.resources: line vendor.

Таким образом, не существует модели, представления, контроллера, теста, таблицы базы данных или чего-либо, что называется вендором / вендорами. При использовании TextMate для поиска в проекте (без учета регистра) слова «vendor» было только одно вхождение «vendor», которого не было в комментарии, файле журнала, файле README или файле 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 patchlevel 174) [i686-darwin9.7.0]

Ответы [ 2 ]

23 голосов
/ 03 июня 2011

Проверьте тестовую папку на наличие файла приспособления с именем vendors.yml.Если он есть и у вас нет таблицы поставщиков, вы получите эти ошибки, поскольку Rails по умолчанию пытается заполнить таблицу поставщиков данными из этого файла.

1 голос
/ 03 июня 2011

Возможно, в вашем файле {RAILS_ROOT} /db/schema.rb есть некоторая информация об этой таблице предыдущих поставщиков. Информация в этом файле используется для построения тестовой среды. Если он содержит информацию таблицы поставщиков, вы можете запустить rake db: schema: dump, чтобы обновить этот файл, а затем снова попробовать свои тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...