Test :: Модульные тесты, проходящие на OS X, с ошибками в CentOS - PullRequest
0 голосов
/ 09 октября 2009

У меня есть набор Test :: Unit тестов для приложения Rails. Он был разработан на OS X под Ruby 1.8.6, Rails 2.3.4.

Я также использую thinkbot-shoulda 2.10.2.

Я использую стандартные светильники Rails, а не фабрики.

Я проверил проект на рабочей станции CentOS Linux 5 для другого разработчика. Он работает на Ruby 1.8.7.

(Приложение работает на CentOS Linux 5 в работе, и там оно работает нормально.)

На моей машине CentOS dev все мои тесты unit проходят.

Однако большинство, но не все, функциональных тестов не работают. Я выделил один тест (удалив все остальные из проекта), чтобы сузить область устранения неполадок.

  context 'on DELETE to :destroy' do
    setup {
      delete(:destroy, { :id => addresses(:mary_publics_address).id }, stans_id)
    }
    should 'delete the address' do
      assert Address.find(:all, :conditions => {
        :id => addresses(:mary_publics_address).id
      } ).blank?
    end
    should 'delete the addresses phone numbers' do
      assert PhoneNumber.find(:all, :conditions => {
        :id => phone_numbers(:mary_publics_phone_number).id
      } ).blank?
    end
  end

Ошибка, которую мы получаем ...

[abc@abc contactdb]$ rake test:functionals --trace
(in /home/abc/projects/contactdb)

[ ... ]

/usr/local/ruby_187/bin/ruby -I"lib:test" "/home/abc/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/addresses_controller_test.rb" 
Loaded suite /home/abc/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader
Started
.E
Finished in 0.426749 seconds.

  1) Error:
test: on DELETE to :destroy should delete the addresses phone numbers. (AddressesControllerTest):
ActiveRecord::RecordNotFound: Couldn't find Address with ID=1254595889
    /test/functional/addresses_controller_test.rb:107:in `__bind_1255114457_160068'
    /usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:369:in `call'
    /usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:369:in `run_current_setup_blocks'
    /usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:368:in `each'
    /usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:368:in `run_current_setup_blocks'
    /usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:350:in `test: on DELETE to :destroy should delete the addresses phone numbers. '

2 tests, 1 assertions, 0 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/ruby_187/bin/ruby -I"lib:test" ...]

Я думаю, что загадка заключается в том, почему он не может найти Address с таким идентификатором.

Другим фактором является то, что когда я закомментирую этот блок, остальные тесты пройдут.

    should 'delete the addresses phone numbers' do
      assert PhoneNumber.find(:all, :conditions => {
        :id => phone_numbers(:mary_publics_phone_number).id
      } ).blank?
    end

Кто-нибудь видел это раньше?

Рекомендации по устранению неполадок?

1 Ответ

2 голосов
/ 10 октября 2009

Одна вещь, которую нужно понять о Hash es в Ruby, это то, что они не сохраняют порядок. До этого у меня были проблемы с изменением порядка хеширования в зависимости от того, какой код загружен в память - даже добавление puts "foo" куда-нибудь могло бы устранить ошибку, потому что я не понимал, что порядок Hash имеет значение где-то глубоко в коде. (Примечание: Hash сохраняет порядок в 1.9.1, особенно из-за подобных проблем, если я должен был догадаться.) Это согласуется с тем, что вы говорите о том, как комментирование кода заставляет другой код проходить. Поскольку большинство приборов считываются с использованием YAML как Hash es, разумно подумать, что это может быть причиной. Найти место, где Hash порядок (то есть что-то вроде each) имеет значение, может иметь или не иметь смысла в вашем случае. Если не что иное, то стоит иметь в виду.

Вы пытались использовать Fixtures.identify(:mary_publics_phone_number) вместо phone_numbers(:mary_publics_phone_number).id? (См. Также: Документация к приборам .) Еще одна вещь, которую следует иметь в виду: у вас могут не быть уникальных имен приборов. Я бы на всякий случай проверил дубликаты. Я знаю многих людей, которые просто копируют и вставляют приборы, потому что они не знают о способности YAML давать значения по умолчанию. В процессе они могут забыть изменить имя прибора. Пример:

DEFAULTS: &DEFAULTS
  created_on: <%= 3.weeks.ago.to_s(:db) %>

first:
  name: Smurf
  <<: *DEFAULTS

Другая проблема, с которой я столкнулся при переходе с OS X на Linux, - это тонкие различия в версии Ruby. (Даже если оба отчета сообщают о 1.8.6, имейте в виду, что уровень исправления имеет значение.) Раньше в случае версии Ruby для Red Hat произошла утечка памяти в сборщике мусора, что требовало от нас перезапуска длительно запущенных процессов. (Прежде чем мы поняли, что происходит, возникли некоторые трудности с поиском ошибок, поскольку они не будут происходить в течение длинного времени.) Поскольку CentOS связан с Red Hat (в основном то же самое, что и RHEL), я мог представить другие различия версий, вызывающие проблемы. Я знаю, что в OS X никогда не было проблемы утечки памяти, которую я описал, что еще больше усложнило проблему. Что касается различий между 1.8.6 и 1.8.7, вам придется обращаться к журналам изменений. Имейте в виду, что версия Ruby, созданная из исходного кода, и упакованная версия могут вести себя по-разному - я думаю, что проблема утечки памяти была введена любым, кто упаковывал Ruby.

Это только несколько возможных причин. Пожалуйста, сообщите с тем, что вы найдете!

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