2012-10-22 8 views
5

Mam plik spec, który wygląda następująco:let() wartość buforowana na przykładach, gdy poprzednio (: wszystkie) jest używane?

# foo_spec.rb 
class Foo 
end 

describe Foo do 
    let(:foo) { 'foo' } 
    subject { bar } 

    # before(:all) { foo } # The seond example fails if uncomment this line. 

    describe 'test one' do 
    let(:bar) { 'one' } 
    it  { should == 'one' } 
    end 

    describe 'test two' do 
    let(:bar) { 'two' } 
    it  { should == 'two' } 
    end 
end 

Oba przykłady są przechodzącej zgodnie z oczekiwaniami. Zanim jednak gdybym un-skomentować (all), drugi przykład nie:

1) Foo test two 
    Failure/Error: it  { should == 'two' } 
     expected: "two" 
      got: "one" (using ==) 

AFAIK, wartość let() będą buforowane w wielu połączeń w tym samym przykład, ale nie w poprzek przykładów. Więc nie do końca wiadomo, dlaczego zawodzi drugi przykład, gdy użyto przed (: wszystkie).

Używam rubin 1.9.2p180 i rspec 2.6.4

+2

Ogólnie rzecz biorąc, użycie 'before (: all)' jest okropnym pomysłem, który powoduje wiele bólu i problemów. –

+0

+1. Jest impet, aby całkowicie go zabić: https://github.com/rspec/rspec-core/issues/573 – pje

+0

powiązane: http://stackoverflow.com/questions/12906268/rspec-rails-and-using-let-leading do konfliktów zmiennych – pje

Odpowiedz

5

To a known problem z RSpec:

let s nie są przeznaczone do stosowania z before(:all) bloków

(Quoting Współtwórca rspec myronmarston z yet another ticket w sprawie problemu (który wydaje się podobny do opisywanego tutaj zachowania)).

Powiązane problemy