【问题标题】:How to test module in a module with rspec?如何使用 rspec 测试模块中的模块?
【发布时间】:2015-06-26 18:11:48
【问题描述】:

我已经设置好了

module A do
  module B do
     def foo
  end
end

在 rspec 内部,我正在尝试测试 foo。

我的rspec文件是这样的

describe A::B do
  describe "#foo" do
    A::B.foo ...
  end 

end

我收到错误 NoMethodError: undefined method foo for A::B:Module

有什么想法吗?

【问题讨论】:

  • 您是否尝试过require 包含您要在规范文件中测试的模块的文件?

标签: ruby rspec


【解决方案1】:

首先,module A do 语法似乎是错误的 - 不应该有 do 字样。第二件事是您尝试在模块 A::B 上调用 foo 方法(A::B 上没有定义类方法 - foo 是一个实例方法)。您的代码应如下所示:

module A
  module B
    def self.foo
    end
  end
end

*(此时可以拨打A::B.foo)

或者,如果您想将 foo 作为实例方法:

module A
  module B
    def foo
    end
  end
end

在这种情况下你不能调用A::B.foo,但你可以创建一个类,其中可以包含A::B模块:

class Test
  include A::B
end

现在你可以调用 Test.new.foo

关于 rspec 测试:

  • 类方法:如您所述
  • 实例方法:
    • 在你的规范中定义测试类,然后测试这个类
    • 将此模块包含到您的 rspec 上下文中(丑陋的方式)

【讨论】:

    【解决方案2】:

    ::A::B#foo 不是模块对象本身的方法。这是模块通过 Ruby 查找层次结构为继承它的对象提供的一种方法。在这种情况下,继承可能是扩展或包含模块。

    class Fooish
      include A::B
    end
    
    a_foo = Fooish.new
    a_foo.foo
    
    an_object = Object.new
    an_object.extend(A::B)
    an_object.foo
    

    人们的方法不同。如果我有一个已经在我的代码库中包含A::B 的对象,我可以将它用于我的测试。如果我正在编写一个使A::B 可供使用的库,那么我可能会测试当我的模块被包含/扩展时它是否符合我的预期。

    后者的一个示例,它也是一种更加孤立的单元测试类型,使用 RSpec 可能如下所示:

    RSpec.describe A::B do
      it "makes #foo available" do
        an_object = Object.new
        expect(an_object).not_to respond_to(:foo)
        an_object.extend(A::B)
        expect(an_object).to respond_to(:foo)
      end
    
      it "does whatever foo does" do
        an_object = Object.new
        an_object.extend(A::B)
        expect(an_object.foo).to eq "something"
      end
    end
    

    请注意,第二个测试将隐式测试第一个测试的行为。您是否希望同时包含两者都取决于您。

    【讨论】:

      【解决方案3】:

      一个相当整洁的设置方法是:

      RSpec.describe A::B do                                
        subject(:object) { Object.new.extend(described_class) }
      
        describe '#foo' do
          expect(object.foo).to eq('whatever')
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多