2012-10-24 28 views
2

我喜歡使用RSpec的include配置方法來包含僅用於命名空間的 模塊,這樣我就不必爲它們的 內部類使用完全限定名稱,並且模塊。這與Ruby 1.9.2中的RSpec 2.11.0一起工作良好。但現在在Ruby 1.9.3上的 已不再適用。我怎樣才能讓它再次運作?在Ruby 1.9.3中通過RSpec配置包含名稱空間模塊

下面的例子foobar_spec.rb:

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 

它將Ruby的工作1.9.2就好了。但它會在Ruby 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 

作爲另一種解決方案,你可以提取新對象創建一個beforelet或只是定義對象作爲測試的subject

+0

似乎並不像ruby-lang.org上的人真的確定這個補丁是否是一個好主意。所以我不確定「故意」的事情。 – aef

0

您需要在它的塊中以及在describe參數中使用Foo :: Bar。

+1

是的。這裏的整個事情是避免必須這樣做,這在Ruby 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 
相關問題