6

我喜欢使用 RSpec 的 include 配置方法来包含仅用于命名空间的模块,这样我就不必为它们的内部类和模块使用完全限定的名称。这适用于 Ruby 1.9.2 中的 RSpec 2.11.0。但是现在在 Ruby 1.9.3 上这不再起作用了。我怎样才能让它再次工作?

这里有一个例子 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
4

3 回答 3

15

这个邮件列表条目讨论了 1.9.3 中关于如何查找常量的根本变化,所以它看起来像是一个故意的变化。

您可以确定整个测试的范围,如下所示:

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

作为另一种解决方案,您可以将新对象创建提取到 abeforelet仅将对象定义为subject测试的。

于 2012-10-24T16:11:14.747 回答
5

如果您的目标是只需要指定一次命名空间,那么惯用的 RSpec 方法是使用describe_class。像这样:

module Foo
  class Bar
  end
end

describe Foo::Bar do
  it "should work" do
    described_class.new
  end
end
于 2014-08-13T06:44:51.427 回答
0

您需要在 it 块和 describe 参数中使用 Foo::Bar 。

于 2012-10-24T15:49:48.390 回答