[英]Assert that Ruby module extends another module
我有兩個模塊 A 和 B,我將 A 擴展到 B 以便將 B 中的 A 的方法用作類方法:
module A
def foo
end
end
module B
extend A
end
B.Foo
我想寫一個測試來斷言模塊 B 擴展了 A。目前 Ruby 沒有實現擴展? 方法,但我認為這將是一個好主意。 無論如何斷言一個模塊擴展了另一個模塊? 我可以使用 responds_to 嗎? 方法,但我必須遍歷擴展模塊中的所有方法,我認為這不是一個很好的設計。 再次感謝,平安。
我同意@spickermann 的評論,即這似乎不是一個有用的測試,他說:
included_singleton_modules = B.singleton_class.included_modules #[A, Kernel]
assert(included_singleton_moduls.include? A)
給你你想要的。
class C
include M
end
本質上只是將M
作為C
的超類“插入”到祖先鏈中。 或者,更准確地說,它從M
創建一個包含類,使該包含類成為C
的超類,並使C
的舊超類成為包含類的超類。
此外,
class C
extend M
end
本質上是一樣的
class << C
include M
end
即它將M
插入到C
的單例類的祖先鏈中。
由於C
是其單例類的實例,而M
是單例類的超類,因此C
是M
的實例。
這意味着您需要做的就是
B.is_a?(A)
#=> true
但是,正如其他答案和評論中提到的那樣,您並不真正關心B
是A
的實例。 你關心的是當你調用B.foo
時,你會得到你期望的行為。 所以,斷言.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.