Однострочный синтаксис должен быть в скобках - PullRequest
0 голосов
/ 26 декабря 2010

В книге «Предписания по тестированию Rails» (b10.0, стр. 176) приведены примеры однострочных утверждений, таких как:

should "be successful" { assert_response :success }

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

should "be successful"; do assert_response :success end

Что не так с синтаксисом первого примера?

Ответы [ 2 ]

4 голосов
/ 26 декабря 2010

Это правильный синтаксис Ruby. Ну вроде. Это просто не имеет смысла!

Поскольку приоритет буквенного блока с использованием фигурных скобок выше, чем передача аргумента без скобок, блок связывается с аргументом вместо вызова метода. Если аргумент сам вызов метода, вы даже не получите синтаксическую ошибку. Вы просто почесаете голову, задаваясь вопросом, почему ваш блок не вызывается.

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

def foo; yield if block_given?; 'foo' end

puts foo { puts 'block' }
# block
# foo

puts(foo) { puts 'block' }
# foo

puts foo do puts 'block' end
# foo

puts foo { puts 'block' }, foo { puts 'block' }
# block
# block
# foo
# foo

puts 'foo' { puts 'block' }
# SyntaxError: (irb):19: syntax error, unexpected '{', expecting $end
2 голосов
/ 02 января 2011

Это может быть ошибкой с моей стороны, когда я пытаюсь заставить пример занять меньше строк. Блок, вероятно, связан с аргументом, а не с вызовом метода, как сказал Йорг.

Я думаю, что правильный способ переписать это как однострочник:

should("be successful") { assert_response :success }

Но, на самом деле, нужно использовать макрос musta:

should respond_with(:success)

Спасибо

Noel

...