测试ruby模块类方法不起作用
我有这样一个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 ".
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
ingSomeModule::Account
,以启用Account\i要在MockClass
上执行的nfo
。