пытается найти файл / строку для:. (eval): 289: предупреждение: не ставьте пробел перед скобками аргумента - PullRequest
0 голосов
/ 16 декабря 2009

Итак, я получаю это предупреждение, когда запускаю свои тесты в ruby ​​/ RoR

. (Eval): 289: предупреждение: не ставьте пробел перед скобками аргумента

Я везде проверил (но, конечно, нет) и не могу найти причину этой ошибки.

Вышеуказанная ошибка просто появляется между тестами ...

Может кто-нибудь подсказать мне, как найти местоположение этой ошибки?

Ответы [ 3 ]

1 голос
/ 16 декабря 2009

Файл и номер строки содержатся в обратном следе. Однако, в вашем случае, предупреждение находится внутри строки, которая eval редактируется во время выполнения. Что означает нет файла . (На самом деле, метод eval * принимает необязательные аргументы для имени файла и номера строки, которые должны отображаться в обратном следе, но в этом случае тот, кто написал код, о котором идет речь, к сожалению, забыл передать эти аргументы. )

Я боюсь, что у вас нет другого выбора, кроме как вручную проверять каждый отдельный вызов eval во всей кодовой базе, и что включает в себя Rails, вашу среду тестирования, все ваше приложение, ваши тесты, ваши плагины, ваши помощники, стандартная библиотека ruby, ...

Конечно, вы должны знать, что проблема может быть не очевидной, как в

eval 'foo (bar, baz)'

Это также может быть что-то вроде

def foo(*args)
  puts args.join
end

bar = 'Hello'
baz = 'World'

foostr = 'foo'                        # in one file
barstr = 'bar'                        # in another file in a different directory
bazstr = 'baz'                        # in another file in a different directory
argstr = "(#{barstr}, #{bazstr})"     # in yet another file
$,     = ' '                          # in some third-party plugin
str    = [foostr, argstr].join        # in a fourth file
eval str                              # somewhere else entirely
eval str, binding, __FILE__, __LINE__ # this is how it *should* be done

Обратите внимание на разницу между двумя предупреждающими сообщениями: первое читается точно так же, как вы опубликовали, но у второго вместо имени (eval) есть имя файла и номер строки внутри файла вместо номер строки внутри строки eval.

Кстати: номер строки 289 в предупреждающем сообщении - это номер строки внутри строки eval d ! Другими словами: где-то в вашем приложении есть строка eval d, длина которой не менее 289 строк! (На самом деле, более вероятно, что это сделано не в вашем приложении, а скорее в Rails. Маршрутизатор Rails был особенно плохим нарушителем, я не знаю, так ли это до сих пор.)

0 голосов
/ 16 декабря 2009

Если это происходит между юнит-тестами, это может быть метод настройки или демонтажа. Попробуйте поискать eval или уменьшите код, который вы используете, пока ошибка не исчезнет. Тогда вы будете знать, где искать (код, который вы только что удалили).

0 голосов
/ 16 декабря 2009

Мне кажется, что существует правило, запрещающее пробел между именем функции и скобками, в которые заключены аргументы функции.

Во многих языках это считается допустимым стилистическим вариантом.

Является ли eval, упомянутый в предупреждающем сообщении, на «функцию», на которую жаловались?

Значит ли число 289 что-либо как номер строки?

Не могли бы вы найти в ваших исходных файлах круглые скобки с пробелом?

Кстати, в сообщении написано warning. Что произойдет, если вы проигнорируете это?

...