在不同的命名空间(模块)下测试两个具有相同名称的类时出现rspec问题

时间:2018-02-16 21:50:44

标签: ruby rspec

免责声明:

  • 我是红宝石的新手
  • 请不要问我为什么我在两个不同的模块中使用相同的类名。我只是想了解为什么rspec会这样做;我发现它令人困惑,无法在网上找到答案。

问题描述:

  • 我在/ lib中有两个.rb文件。
  • 两个人都有一个名字的班级 FooClass,但在不同的模块下(NamespaceOne,NamespaceTwo)。
  • 然而,当我运行rspec时,一个测试失败,因为它针对错误的类运行并且失败消息看起来很奇怪,即失败消息的一部分意味着它正在查看NamespaceOne,而很明显它实际上尝试运行测试NamespaceTwo。

我的问题:为什么rspec会这样做?我错过了什么?

这是我在lib文件夹中的内容:

LIB / one.rb:

module NamespaceOne

  class FooClass
    def self.method_one(input)
      1
    end
  end
end

LIB / two.rb:

module NamespaceTwo

  class FooClass
    def self.method_two(input)
      2
    end
  end
end

,这是两个相应的规格:

规格/ one_spec.rb

require "one"

include NamespaceOne

describe FooClass do

    describe ".method_one" do
        context "given an empty string" do
            it "returns 1" do
                expect(FooClass.method_one("")).to eql(1)
            end
        end
    end

end

和spec / two_spec.rb

require "two"

include NamespaceTwo

describe FooClass do

    describe ".method_two" do
        context "given an empty string" do
            it "returns 2" do
                expect(FooClass.method_two("")).to eql(2)
            end
        end
    end

end

最后,rspec输出:

$ bundle exec rspec --format documentation

NamespaceOne::FooClass
  .method_one
    given an empty string
      returns 1 (FAILED - 1)

NamespaceTwo::FooClass
  .method_two
    given an empty string
      returns 2

Failures:

  1) NamespaceOne::FooClass.method_one given an empty string returns 1
     Failure/Error: expect(FooClass.method_one("")).to eql(1)

     NoMethodError:
       undefined method `method_one' for NamespaceTwo::FooClass:Class
       Did you mean?  method_two
     # ./spec/one_spec.rb:10:in `block (4 levels) in <top (required)>'

Finished in 0.00201 seconds (files took 0.08006 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/one_spec.rb:9 # NamespaceOne::FooClass.method_one given an empty string returns 1

注意:在tests / examples中,如果我使用完整命名空间调用该方法,则测试会通过。即各个规范文件中的以下调整使测试通过,

规格/ one_spec.rb

expect(NamespaceOne::FooClass.method_one("")).to eql(1)

spec / two_spec.rb

expect(NamespaceTwo::FooClass.method_two("")).to eql(2)

但我不明白为什么'包括'模块,因为我做的还不够。

1 个答案:

答案 0 :(得分:0)

当你做

require "one"

include NamespaceOne

describe FooClass do

您在NamespaceOne中加入Object,但ruby不知道下一个名称空间FooClass应解析为NamspaceOne。那是因为它是词法上的(https://stackoverflow.com/a/20848317/3109182)。而是在描述时使用完整的命名空间,这样rspec和ruby知道要解析的常量:

require "one"    
describe NamespaceOne::FooClass do
end