Подтвердить что ты не робот

Общие примеры rspec и общий контекст

Какова реальная разница между shared_examples и shared_context?

Мои наблюдения:

  • Я могу тестировать одни и те же вещи, используя оба (т.е. с shared_examples или shared_context)

  • Но некоторые из моих других тестов терпят неудачу, если я использую более поздние версии.

Наблюдение # 1:

Я сравнил shared_examples и shared_context в документации по < а2 >

Синтаксические различия:

  • shared_context для определения блока, который будет оцениваться в контексте групп примеров путем неявного соответствия метаданных

Пример:

shared_context "shared stuff", :a => :b do
  ...
end
  • Способ их включения или вызова из тестового файла

shared_examples

include_examples "name"      # include the examples in the current context
it_behaves_like "name"       # include the examples in a nested context
it_should_behave_like "name" # include the examples in a nested context

shared_context

include_context "shared stuff"

Наблюдение # 2

У меня есть тестовый пример

shared_context 'limit_articles' do |factory_name|
  before do
    @account = create(:account)
  end

  it 'should restrict 3rd article' do
    create_list(factory_name, 3, account: @account)

    article4 = build(factory_name, account: @account)
    article4.should be_invalid
  end

  it 'should allow 1st article' do
    ...
  end

  it 'should allow 2nd article' do
    ...
  end
end

И включите контекст в файл спецификаций, в который уже включен один shared_context, а затем отсутствует. Но я меняю порядок, тогда все мои тестовые проходы

Сбой

include_context 'existing_shared_context'

include_context 'limit_articles'

Также, если я заменил shared_context на shared_examples и соответственно включил его в тестовый файл.

Пропуска

include_context 'existing_shared_context'

it_behaves_like 'limit_articles'
4b9b3361

Ответ 1

shared_examples - тесты, написанные таким образом, что вы можете запускать их в нескольких настройках; извлечение общего поведения между объектами.

it_behaves_like "a correct object remover" do
    ...
end

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

include_context "has many users to begin with"

Ответ 2

shared_examples содержит коллекцию примеров, которые вы можете включить в другие блоки shared_examples.

В shared_context содержится коллекция общего кода, которую вы можете включить в свой тестовый файл. Думайте об этом как о модуле ruby.

Вы используете shared_context в своем тестовом коде, включив его в метод include_context.

С другой стороны, вы утверждаете, что определенная вещь behaves_like как группа примеров общего behaves_like.

Это вопрос читаемости, я думаю.

ОБНОВИТЬ:

Если вы посмотрите на исходный код, то увидите, что это одно и то же. Проверьте строку 98 в этом файле:

https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/shared_example_group.rb

alias_method :shared_context,      :shared_examples

Ответ 3

Очень тривиальный и косметический, но include_context не выводит "ведет себя как" в --format documentation.

Ответ 4

Здесь отличная рецензия Руди Джахчана, которая не только показывает, как использовать как shared_context, так и shared_example, это также показывает, почему они ценны. Он делает это, беря спецификацию, а затем рефакторинг (DRYing) использует shared_example и shared_context.

Состав BDD над наследованием с использованием общих примеров RSpec