У этого должен быть легкий ответ, но я изо всех сил пытаюсь его найти (проверил документацию RSpec, EverydayRails Testing с RSpec, результаты Google). В моих спецификациях моделей я хотел бы включить основные спецификации атрибутов следующим образом:
describe Foo do
describe "basic attributes" do
before { @foo = create(:foo) }
subject { @foo }
it { should be_valid }
it { should respond_to(:color) }
it { should respond_to(:height) }
it { should respond_to(:some_other_attribute) }
it { should respond_to(:you_get_the_idea) }
...
Мне нравятся эти спецификации, потому что, если в моей модели factory и/или какой-то ошибке есть какая-то ошибка, эти спецификации помогают мне быстро определить ее.
Я включил синтаксис expect
во все другие спецификации, и мне нравится, как он читает, но как его использовать здесь? Один из вариантов может быть
expect(@foo).to respond_to(:color)
И еще может быть
expect(it).to respond_to(:color)
Первое включает дублирование, которое избегается синтаксисом should
, но последнее выглядит мне странным (это может быть только я).
Я понимаю, что этот вопрос связан скорее с стилем, чем с функциональностью *, но мы, разработчики Ruby, добросовестно относимся к стилю, и я хочу придерживаться стандартных практик и иметь читаемый, идиоматический код. Любая помощь приветствуется. Спасибо.
ОБНОВЛЕНИЕ: Между прочим, ни один из моих предложенных вариантов не работает. Они оба бросают ошибки undefined method 'expect'
. Теперь я действительно смущен!
Подумав об ошибке, я понимаю это, потому что спецификации should
выше находятся в пределах одного строчного блока. Тогда возникает путаница, как я могу написать однострочный блок с синтаксисом ожидания? В свете этого обновления вопрос о функциональности очень важен, и я буду рад услышать мысли других.
4/2015 UPDATE
rspec > 3.0
добавил еще один способ обращения с ними, и похоже, что rspec ~> 4.0
покончит с синтаксисом should
. Пер Мирон Мастера:
Некоторые пользователи выразили путаницу в отношении того, как это должно относиться к синтаксису ожидания, и если вы можете продолжать его использовать. Он будет по-прежнему доступен в RSpec 3 (опять же, независимо от конфигурации синтаксиса), но мы также добавили альтернативный API, который немного согласуется с синтаксисом ожидания:
describe Post do
it { is_expected.to allow_mass_assignment_of(:title) }
end
is_expected определяется очень просто, как ожидание (субъект), а также поддерживает отрицательные ожидания через is_expected.not_to matcher. [...]
В RSpec 3 мы сохранили синтаксис if, и он доступен по умолчанию, но вы получите предупреждение об устаревании, если вы его используете без явного его включения. Это проложит путь для его отключения по умолчанию (или потенциально извлеченного в отдельный камень) в RSpec 4, при этом минимизируя путаницу для новичков, прибывающих в RSpec через старый учебник.