web-dev-qa-db-fra.com

exemples partagés rspec vs contexte partagé

Quelle est la vraie différence entre shared_examples et shared_context?

Mes observations:

  1. Je peux tester les mêmes choses en utilisant les deux (c'est-à-dire avec shared_examples ou shared_context)

  2. Mais certains de mes autres tests échouent si j'en utilise un plus tard.

Observation n ° 1:

J'ai comparé shared_examples et shared_context per documentation sur https://www.relishapp.com/

Les différences syntaxiques sont les suivantes:

  • shared_context pour définir un bloc qui sera évalué dans le contexte des exemples de groupes en mettant en correspondance implicitement les métadonnées

Exemple :

shared_context "shared stuff", :a => :b do
  ...
end
  • La façon dont ceux-ci sont inclus ou appelés à partir d'un fichier de test

exemples_partagés

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

contexte_partagé

include_context "shared stuff"

Observation n ° 2

J'ai un cas test

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

Et incluez le contexte dans un fichier de spécifications qui contient déjà un shared_context, le fichier existant échouant. Mais je change la commande puis tout mon test passe

Échoue

include_context 'existing_shared_context'

include_context 'limit_articles'

Aussi, si je remplace le shared_context par le shared_examples et que je l'incline en conséquence dans le scénario de test.

Passe

include_context 'existing_shared_context'

it_behaves_like 'limit_articles'
30
swapab

shared_examples sont des tests écrits de manière à pouvoir les exécuter dans plusieurs paramètres; extraire le comportement commun entre les objets. 

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

shared_contexts est un code d'installation que vous pouvez utiliser pour préparer un scénario de test. Cela vous permet d'inclure des méthodes d'assistance de test ou de préparer l'exécution des tests.

include_context "has many users to begin with"
41
rafroehlich2

shared_examples contient une collection d'exemples que vous pouvez inclure dans d'autres blocs de description.

Un shared_context contient une collection de code partagé, que vous pouvez inclure dans votre fichier de test. Pensez à cela comme un module Ruby.

Vous utilisez un shared_context dans votre code de test en l'incluant avec la méthode include_context.

D'autre part, vous déclarez qu'une certaine chose behaves_like est un groupe d'exemple partagé.

C'est une question de lisibilité, je suppose.

METTRE À JOUR:

Si vous regardez le code source, vous verrez qu’ils sont exactement la même chose. Vérifiez la ligne 35 dans ce fichier:

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

alias_method :shared_context,      :shared_examples
16
Jon

Très trivial et esthétique, mais include_context ne génère pas "se comporte comme" dans --format documentation.

4
hiroshi

Voici un excellent article de Rudy Jahchan qui montre non seulement comment utiliser à la fois shared_context et shared_example, mais aussi pourquoi ils sont précieux.
Il le fait en prenant une spécification, puis en le restructurant (DRYing) pour utiliser shared_example et shared_context.

Composition BDD sur héritage avec exemples partagés RSpec

0
aenw