Синтаксис RSpec 'Expect' и спецификация атрибута Idiomatic

Это должен быть простой ответ, но яЯ пытаюсь найти его (проверил документацию 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) }
    ...

Мне нравятся эти спецификации, потому что, если на моей фабрике и / или модели есть какая-то ошибка, эти спецификации помогают мне быстро ее определить.

мы включилиexpect синтаксис во всех других спецификациях, и мне нравится, как он читает, но как его использовать здесь? Один из вариантов может быть

expect(@foo).to respond_to(:color)

И другой может быть

expect(it).to respond_to(:color)

Первое включает в себя дублирование, которое избегается сshould синтаксис, но последний выглядит странно для меня (который может быть только я).

Я понимаю, что этот вопрос больше относится к стилю, чем к функциональности *, но мы, разработчики Ruby, добросовестно относимся к стилю, и я хочу придерживаться стандартных практик и иметь читаемый идиоматический код. Любая помощь приветствуется. Благодарю.

ОБНОВЛЕНИЕ: ни один из моих предложенных вариантов фактически не работает, кстати. Они оба бросаютundefined method 'expect' ошибки. Сейчас я'Я действительно смущен!

Подумав об ошибке, я понимаю,потому чтоshould спецификации выше находятся внутри однострочного блока. Тогда возникает путаница: как написать однострочный блок с ожидаемым синтаксисом? В свете этого обновления вопрос очень о функциональности, и ябудет взволнован, чтобы услышать чужие мысли.

4/2015 ОБНОВЛЕНИЕ

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 мыМы сохранили синтаксис must, и он доступен по умолчанию, но вы получите предупреждение об устаревании, если будете использовать его без явного включения. Это проложит путь к его отключению по умолчанию (или, возможно, извлечению в отдельный драгоценный камень) в RSpec 4, одновременно сводя к минимуму путаницу для новичков, приходящих в RSpec через старое руководство.

 Sun22 мая 2013 г., 04:08
Можете ли вы поделиться одной из ваших спецификаций, которые включилиexpect синтаксис?
 aceofbassgreg22 мая 2013 г., 04:11
Они довольно простые и содержатся в документах RSpec, а также в других источниках. Вот'отличный пост в блоге о синтаксисе:myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax, Мои примеры по сути выглядят так, но онив блоках (т.е.it "does something" do ) ...

Ответы на вопрос(2)

Решение Вопроса

Мирон Марстон, один из ключевых коммиттеров RSpec, объясняетВот что вы все еще должны использовать

it { should be_cool }

Если ты'мы отключилиshould синтаксис, он предлагает решение для псевдонимаexpect_it к:it

RSpec.configure do |c|
  c.alias_example_to :expect_it
end

RSpec::Core::MemoizedHelpers.module_eval do
  alias to should
  alias to_not should_not
end

Имея это в виду, вы можете написать это как:

describe User do
  expect_it { to be_valid }
end
 Myron Marston22 мая 2013 г., 20:52
Просто чтобы быть ясно: даже если вы настроили вещи для отключенияshould синтаксис, один лайнерit { should matcher } синтаксис все еще работает: отключениеshould Синтаксис о том, чтобы не обезьяна исправления всех объектов с должен, ноExampleGroup#should все еще работает, так как не требует никаких обезьяньих патчей.
 aceofbassgreg22 мая 2013 г., 04:39
Ух, отличная находка по этому вопросу! Кроме того, я связал МиронСообщение в блоге в комментарии выше, так чтоЗабавно, что вы нашли его ответ на очень похожий вопрос. Интересно, если один вкладышshould будет устаревшим в какой-то момент. У меня нетнастроил RSpec для отключенияshould синтаксис, так что я полагаю,Я все еще буду использовать его в этом случае. Спасибо!

Я нене думаю, что тамправильный ответ на этот вопрос, но янедавно переписывал мои тестовые наборы, чтобы отойти отshould и использоватьexpect синтаксис исключительно, поэтому яЯ добавлю свои два цента. Я решил переписать в значительной степени, потому чтоМирон Марстонведущий сопровождающий RSpec,писал:

В будущем мы планируем изменить значения по умолчанию, чтобы было доступно только ожидаемое значение, если вы не включили явно. Мы можем сделать это, как только появится RSpec 3.0, но мы хотим дать пользователям достаточно времени, чтобы познакомиться с ним.

Он такжепрокомментировал:

У нас нет планов когда-либо удалить "должен"... но ожидайте, что есть меньше ошибок, и это синтаксис, который я бы порекомендовал для новых проектов.

Я согласен сМарк Рушаковс ответом, но лично я нене нужно создавать эти псевдонимы, чтобы сохранить одинitблочный синтаксис. Итак, используя ваш пример, где изначально я написал спецификацию модели, такую как ваш пример, в этой форме:

describe Foo do
  let(:foo) { create(:foo) }
  subject { foo }
  describe "model attributes" do
    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) }
  end
  # ...
end

Я сейчас хотел бы написать это так:

describe Foo do
  let(:foo) { create(:foo) }
  specify "model attributes" do
    expect(foo).to be_valid
    expect(foo).to respond_to(:color)
    expect(foo).to respond_to(:height)
    expect(foo).to respond_to(:some_other_attribute)
    expect(foo).to respond_to(:you_get_the_idea)
  end
  # ...
end

Мое мнение таково, что ссылкиfoo прямо вexpect(foo).to respond_to(:color) столько жедублирование» как ссылка наsubject косвенно используяit, так что я'Я не слишком помешан на этом, и ям греется так, чтоexpect спецификации в основном читаются. Но, в конечном счете, я думаю, что это сводится к тому, чтобы быть вопросом предпочтительного стиля письма.

 Paul Fioravanti22 мая 2013 г., 05:14
Я вижу где тыприходит и этодостаточно справедливо. На аналогичной ноте мне нравится держать мои строки в пределах 80 символов, и если у вас есть длинная тестовая строка, в то время какit блок может разрешить несколько строк, изменив{...} вdo ... end,expect заявление в несколько строк в конечном итоге выглядитexpect(foo).to \ be_valid сbe_valid на следующей строке. Поначалу это может показаться немного неловким, но ямы привыкли к этому; опять же, просто личные предпочтения.
 Paul Fioravanti22 мая 2013 г., 05:27
Я нене думаю, что тыошибаюсь, поскольку существует неявный блок вexpect(foo) что вы можете многострочно явно, как у вас есть. Я просто предпочитаю иметьexpect(some.really.long.code).to Заявление всем будет на одной линии с моими собственными субъективными идеями по читабельности :-)
 aceofbassgreg22 мая 2013 г., 22:24
@ Матт - да,create исходит от Factory Girl. Я изменил синтаксис вspec_helper.rb как объяснено здесь:github.com/thoughtbot/factory_girl/blob/master/....
 aceofbassgreg22 мая 2013 г., 05:05
Вы'прав в этом "дублирование» ISN»это действительно большое дело, хотя для более длинных названий моделей используетсяЭто' сохраняет много символов, особенно если есть много атрибутов. Спасибо за вдумчивый ответ!
 Matt23 мая 2013 г., 20:13
@aceofbassgreg - Спасибо. Все- мне нравится это решение, но есть ли эффективный способrspec -f doc ' чтобы атрибуты модели отображались под указанным текстом? По сути яЯ пытаюсь документировать и тестировать одним махом.
 Matt22 мая 2013 г., 20:43
Является "Создайте" идет от FactoryGirl?
 aceofbassgreg22 мая 2013 г., 05:17
мы писали несколько строкexpect спецификации следующим образом:expect { \ some.really.long.code \ }.to be_valid  который я предположил, был идиоматическим, но, возможно, ошибся ??

Ваш ответ на вопрос