2012-10-24 4 views
2

RSpec의 include 설정 방법을 사용하여 모듈을 네임 스페이스로 사용하여 내부 클래스에 대해 정규화 된 이름을 사용할 필요가 없으며 모듈. 이것은 Ruby 1.9.2에서 RSpec 2.11.0에서 잘 작동합니다. 그러나 이제는 Ruby 1.9.3에서 더 이상 작동하지 않습니다. 다시 작동 시키려면 어떻게해야합니까? 다음의 예 foobar_spec.rb 루비 1.9.3에서 RSpec 설정을 통한 네임 스페이스 모듈 포함하기

:

module Foo 
    class Bar 
    end 
end 

RSpec.configure do |config| 
    config.include Foo 
end 

describe Foo::Bar do 
    it "should work" do 
    Bar.new 
    end 
end 

다음 명령을 호출하는 경우 :

rspec foobar_spec.rb 

그것은 루비에서 작동이 잘 1.9.2. 그러나 루비 1.9.3에 다음과 같은 오류가 발생합니다 :

Failure/Error: Bar.new 
    NameError: 
     uninitialized constant Bar 

답변

12

mailing list entry은 상수를 찾는 방법에 대한 1.9.3의 근본적인 변화를 설명하므로 의도적으로 변경된 것처럼 보입니다.

당신은 범위이 같은 전체 테스트, 수 : 또 다른 방법은

module Foo 
    describe Bar do 
    it "should work" do 
     Bar.new 
    end 
    end 
end 

, 당신은 before 또는 let에 새 개체 만들기를 추출하거나 시험의 subject 등의 객체를 정의 할 수 있습니다.

+0

ruby-lang.org의 사람들이이 패치가 실제로 좋은 아이디어인지 확실하지 않은 것 같습니다. 그래서 나는 "고의적 인"것에 대해서는 확신하지 못한다. – aef

0

당신은 그것을 블록에서뿐만 아니라 기술 인수에 푸 :: 줄을 사용해야합니다.

+1

예. 여기있는 모든 일은 루비 1.9.2에서 작동하는 것을 피하는 것이 었습니다. 그리고 한 모듈을 다른 모듈에 포함 시키면 Ruby 1.9.3에서 작동하지만, RSpec에서는 더 이상 작동하지 않습니다. – aef

+0

하지만 .. 샘의 방위에서, 뭔가 이름을 붙일만한 것이 아닌가? 네임 스페이스를 통해 액세스해야합니까? – baash05

3

목표가 네임 스페이스를 한 번만 지정하면 되겠지만 관용 RSpec 방법은 described_class을 사용하는 것입니다. 좋아요 :

module Foo 
    class Bar 
    end 
end 

describe Foo::Bar do 
    it "should work" do 
    described_class.new 
    end 
end