Общие примеры 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'
Ответы
Ответ 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