Во время выполнения тестов на огурцы время от времени он прерывается с перерывами. Ошибка:
*** ActionView::Template::Error Exception: Missing partial items/_fields with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}. Searched in:
* "/my/path/to/application/app/views"
* "/my/path/to/rvm/gems/ruby-2.1.5/gems/kaminari-0.16.3/app/views"
* "/my/path/to/rvm/gems/ruby-2.1.5/gems/devise-3.5.4/app/views"
Да, частичный файл существует в /my/path/to/application/app/views/items/_fields.html.haml
Кикер - это то, что иногда проходит тест, иначе он будет терпеть неудачу. Я бегу на машине Red Hat 5.
Итак, чтобы отладить это, я решил бросить begin/rescue
.
.fields
- begin
= render partial: 'items/fields', locals: {f: f}
- rescue Exception => e
= byebug
- if f.can_modify?(:object_a)
= render partial: 'layouts/object_a_field', locals: {f: f, field: :object_a}
- else
.field#object_a
= render partial: 'layouts/attribute', locals: {label: 'Object A', value: f.object.object_a_id ? f.object.object_a_number : 'Not Assigned'}
.field#name
- if f.can_modify?(:name)
= f.label :name
= f.text_field :name, {class: 'inputbox large_field', readonly: f.cannot_modify?(:name)}
.smltxt (short description of the item)
- else
= render partial: 'layouts/attribute', object: f.object, locals: {field: :name}
Для любопытных, что в частичном items/fields
:
.field
- if f.can_modify?(:name)
= f.label :name, 'Item'
= f.text_field :name, {class: 'inputbox uppercase', maxlength: 16, readonly: !f.object.identifier.new_record?}
.smltxt (character identifier)
- else
= render partial: 'layouts/attribute', object: f.object, locals: {field: :name, label: 'Item'}
Когда он проходит, я, очевидно, не ударяю байбуга, но когда он терпит неудачу, я делаю! Это позволяет мне играть с ним в среде типа Rails Console.
Поэтому я решил запустить эту специальную команду:
(byebug) render partial: 'items/fields', locals: {f: f}
И я получаю:
*** ActionView::Template::Error Exception: Missing partial items/_fields with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}. Searched in:
* "/my/path/to/application/app/views"
* "/my/path/to/rvm/gems/ruby-2.1.5/gems/kaminari-0.16.3/app/views"
* "/my/path/to/rvm/gems/ruby-2.1.5/gems/devise-3.5.4/app/views"
Итак, я думал, что удалю локальных жителей, чтобы увидеть, что-то изменилось:
(byebug) render partial: 'items/fields'
И я получаю:
*** ActionView::Template::Error Exception: undefined local variable or method `f' for #<#<Class:0x0000002a907610>:0x00000027beae48>
Таким образом, очевидно, что теперь он волшебным образом обнаруживает частичный, и он знает, что ему не хватает локальной переменной f
.
Обновление 1
Я добавил остальную часть представления, которая для ясности вызывает частичное выше.
В попытке устранить неполадки я также взял содержимое items/_fields.html.haml
и поместил его там, где у меня был render partial: 'items/fields', locals: {f: f}
..., тогда тест прошел, что означает, что другие частичные файлы в файле не имели выпуск. Таким образом, похоже, что это не может быть связано с содержимым файла.
Обновление 2
Кажется, добавив тег @javascript к нашей самой первой функции Cucumber, эта проблема часто устраняется. Каким-то образом браузер, загруженный перед другими тестами, улучшает шансы на его передачу. Не имеет смысла для меня, может быть, у кого-то есть идея об этом?
Обновление 3
Сегодня было обнаружено, что ошибка вообще не связана с огурцом. Такая же ошибка была обнаружена в производстве. Веб-интерфейс показал недостающую частичную ошибку, но для файла, который действительно существует. После перезапуска сервера Passenger с помощью touch tmp/restart.txt
и затем ошибка исчезла. Так что он все еще очень прерывистый.
Обновление 4
Я добавил содержимое части, которое, кажется, случайно отсутствует.
Как мне узнать, почему Rails не может найти частичное, что на самом деле есть?