2012-04-01 5 views
0

Ich versuche ein paar let 's und before Hooks zu definieren, die global für alle meine Spezifikationen ausgeführt werden, indem Sie sie in eine separate Datei mit der Rspec configuration block aufnehmen.rspec shared_context und include_context für alle Spezifikationen

habe ich versucht, so etwas wie:

module Helpers 
    def self.included(base) 
    base.let(:x){ "x" } 
    base.before(:all){ puts "x: #{x}" } 
    end 
end 

Rspec.configure{|c| c.include Helpers } 

aber nicht wie erwartet funktionieren. Die before(:all) läuft nicht nur vor jeder Hauptbeispielgruppe, sondern auch jede verschachtelte.

Dann fand ich über shared_context aus und es scheint genau das zu sein, was ich will.

Mein offenes Problem ist jedoch, dass ich nicht herausfinden kann, wie ich einen Kontext unter ALL meiner Spezifikationen teilen. Die Dokumentation bezieht sich nur auf include_context innerhalb einer bestimmten Spezifikation.

Kann mir jemand sagen, wie ich dieses Verhalten in einer globalen Weise erreichen kann? Ich bin mir bewusst, dass ich vor dem Haken in meinem spec_helper global definieren kann, aber ich kann nicht verwenden let scheinen. Ich möchte einen einzigen Ort, an dem ich diese beiden Dinge definieren kann und meinen Spezifikationshelfer nicht verschmutze, sondern ihn einfach mit einschließen.

+0

Nach RSpec Tests 'vor (: all)' must [laufen nur einmal] (https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/hooks/before- and-after-hooks # 7), egal wo es definiert wurde. Vielleicht ist es ein RSpec-Problem? –

+0

Nein, ich denke nicht, dass dies ein Problem ist. Ich denke nicht, dass der obige Code die beabsichtigte Verwendung von Modulen in der Konfiguration ist. Ich bin mir ziemlich sicher, dass das Modul in jeder Beispielgruppe enthalten sein wird, einschließlich verschachtelter, so dass es sinnvoll ist, dass mein 'before (: all)' vor jeder Beispielgruppe läuft. – brad

Antwort

2

Ich habe versucht, Ihre Fehler zu reproduzieren, scheiterte aber.

# spec_helper.rb 
require 'support/global_helpers' 

RSpec.configure do |config| 
    config.include MyApp::GlobalHelpers 
end 

# support/global_helpers.rb 
module MyApp 
    module GlobalHelpers 
    def self.included(base) 
     base.let(:beer) { :good } 
     base.before(:all) { @bottles = 10 } 
    end 
    end 
end 

# beer_spec.rb 
require 'spec_helper' 

describe "Brewery" do 

    it "makes good stuff" do 
    beer.should be :good 
    end 

    it "makes not too much bottles" do 
    @bottles.should == 10 
    end 

    context "when tasting beer" do 
    before(:all) do 
     @bottles -= 1 
    end 

    it "still produces good stuff" do 
     beer.should be :good 
    end 

    it "spends some beer on degusting" do 
     @bottles.should == 9 
    end 
    end 
end 

https://gist.github.com/2283634

Wenn ich so etwas wie base.before(:all) { p 'global before'; @bottles = 10 }, schrieb bekam ich genau eine Zeile in spec ausgegeben.

Beachten Sie, dass ich nicht Instanzvariablen innerhalb eines Beispiels zu ändern versuchte, weil it wouldn't work anyway (na ja, Sie tatsächlich können Instanzvariablen ändern, wenn es ein Hash oder ein Array ist). Außerdem, selbst wenn Sie before(:all) in verschachteltem Beispiel Gruppe before(:each) ändern, wird es noch 9 Flaschen in jedem Beispiel.

+0

Ich habe gerade Ihren Code und bekam 2 'vor (alle)' s – brad

+0

oh interessant ... Ich war mit einer alten Version von rspec, neue Version läuft nur einmal ... vielleicht kann * ich * tun, was ich will! – brad

+0

da ist noch etwas Seltsames los. Ich habe eine 'vor (: alle)', die * nur * eine 'puts'-Anweisung gibt, und sie bricht meine Tests auf unerklärliche Weise. Nimm das 'vorher (: alle)' raus und alles funktioniert. Ich denke immer noch nicht, dass die Verwendung eines solchen Moduls die beabsichtigte Methode ist. Ich bin mir ziemlich sicher, dass ich einen 'shared_context' haben möchte, ich weiß einfach nicht, wie ich ihn global benutzen soll. – brad

Verwandte Themen