2014-01-14 3 views
28

В чем разница между shared_examples и shared_context?rspec общие примеры vs общий контекст

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

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

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

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

Я сравнил shared_examples и shared_context за документацией на https://www.relishapp.com/

синтаксических различий:

  • 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' 
+2

Следующие страницы из 'rspec' документации должны сказать вам свои цели: [' Общий examples'] (https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/example-groups/shared-examples), ['Shared context'] (https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/shared-context) – vee

+0

Я обновил свой вопрос примерами и подробными наблюдениями. – swapab

+0

Наблюдение 2 содержит тесты. Это должна быть общая группа примеров. Это просто читаемость в ваших тестах. – Jon

ответ

34

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

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

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

include_context "has many users to begin with" 
+0

Спасибо за ваш ответ. Я обновил свой вопрос примерами и подробными наблюдениями. – swapab

14

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

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

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

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

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

UPDATE:

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

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

alias_method :shared_context,  :shared_examples 
+0

Спасибо за ваш ответ. Я понимаю теорию, но потом она выглядит почти похожей на меня, за исключением нескольких синтаксических различий. Я обновил свой вопрос примерами и подробными наблюдениями. – swapab

+0

Это очень просто ... поместите тесты в общий пример, которому вы хотите, чтобы несколько вещей соответствовали. Поместите код в общий контекст, который необходимо включить в несколько тестов. – Jon

4

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

0

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

BDD Composition over Inheritance with RSpec Shared Examples

Смежные вопросы