测试ruby模块类方法不起作用

测试ruby模块类方法不起作用,ruby,Ruby,我有这样一个ruby模块: modulesomemodule 模块帐户 def self.account_info 引发未实现的错误 结束 结束 结束 这是我的测试: describe ExchangeClientWrapper::Account do let(:mock_class) do class MockClass extend SomeModule::Account end end describe ".

我有这样一个ruby模块:

modulesomemodule
模块帐户
def self.account_info
引发未实现的错误
结束
结束
结束
这是我的测试:

  describe ExchangeClientWrapper::Account do
    let(:mock_class) do
      class MockClass
        extend SomeModule::Account
      end
    end

    describe ".account_info" do
      it "raises a NotImplementedError" do
        expect { mock_class.account_info }.to raise_error(NotImplementedError)
      end
    end
  end
end
我得到这个错误:

 expected NotImplementedError, got #<NoMethodError: undefined method `account_info' for MockClass:Class> with backtrace:
但这似乎是可行的:

 module A
    module B
      def self.d
        puts "hi there"
      end
    end
end

class C
    include A
end

C::B.d

阅读本文中的参考资料,我发现
extends
已经可以与Singleton类一起工作,因此
self
是不必要的

我用这段代码做了一个小测试,删除了定义中的
self

module SomeModule
  module Account
    def account_info
      raise NotImplementedError
    end
  end
end

class MockClass
  extend SomeModule::Account
end

MockClass.account_info

这会引发NotImplementedError

我在考虑您命名方法的方式(
self.d
),试图扩展它会产生麻烦。我读了一篇可能对你有帮助的文章?另一件事,我应该放弃,因为我认为写下它是一个错误,那就是你写了
modulesomemoudle
,而不是
modulesomemodule
模块方法(
def self.meth…
),而不是模块实例方法(是的,用词不当,但这就是它们被称为的)在类包含或扩展了它们的模块后,不能用类或类的实例作为它们的接收者来执行。它们唯一的用途是在它们的模块上被调用,例如
Math
模块(例如
Math.sin(r)
)实际上,它们在非OOP语言中被视为函数。
C.d#=>NoMethodError(C:Class的未定义方法“d”)
因此应该毫不奇怪。
C::B.d
显示
“您好”
仅仅是因为
A::B.d
做了同样的事情。@Lomefin啊,很抱歉这里有个打字错误。在帖子中更正了它。顺便说一句,这不是
NotImplementedError
的目的。根据
NotImplementedError
是:“在当前平台上未实现某项功能时引发。例如,如果基础操作系统或Ruby运行时不支持依赖于
fsync
fork
系统调用的方法,则可能引发此异常。”。"按照
account\u info
中提供的方式使用它表明平台无法支持此功能,在这种情况下,这将是不适当的和误导性的。如前所述,您的模块可用于创建account\u info类或实例方法。如果您希望您的方法仅为类方法,我建议使用
include
和将它们定义为模块中的类方法。
def self.include(基本)base.extend ClassMethods end
然后在SomeModule::Account中的
模块ClassMethods
中定义您的方法。有关在模块中混合实例方法、类方法和代码注入的示例,请参阅。这当然是按类扩展模块的常规方法。
Account
是在r模块不相关。如果
Account
不包含
程序中的任何地方,那么将
Account\u info
定义为模块方法将更简单、更清晰,称为
SomeModule::Account.Account\u info
而不是
extend
ing
SomeModule::Account
,以启用
Account\i要在
MockClass
上执行的nfo