RSpec DSL是否违反了得墨忒耳的法律?

时间:2012-03-02 02:32:34

标签: ruby rspec law-of-demeter

这可能是一个天真的问题,但RSpec的测试DSL是否违反了得墨忒耳的法律?

以下是来自http://rspec.info的RSpec DSL示例:

bowling.score.should eq(0)

从Demeter的角度来看,这似乎与我的例子无法区分:

user.department.try(:name)

根据Avdi Grimm 违反了得墨忒耳法则。

来源:http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/

2 个答案:

答案 0 :(得分:2)

德米特是一个降低风险的指导方针,其动机是少一个人的想法 系统的一部分取决于其他部分的结构,可能性较小 该部分将受到所述结构变化的影响。

你当然可以说game.score.should eq(0)是德米特 违规,但should方法是rspec框架的一部分,即 语句game.score.should eq(0)周围的上下文并且不太可能 以一种强制改变这种陈述的方式改变。

也许它违反了Demeter,也许它没有,但Demeter旨在解决的风险并非如此 真的在场。

答案 1 :(得分:1)

这显然是主观的,但我相信

should调用是RSpec的语言的一部分,它恰好构建在Ruby之上。没有理由不能:

should_be_equal(bowling.score, 0)

(或类似)但这不是RSpec的语言。此外,对于规范,should方法仅存在于specs中的该对象上。

尝试(有点粗略地,或许)更好地说明我关于成为语言一部分的论点:

bowling.score + 10

实际上是在+上调用score方法,但您会将此视为demeter违规法吗? +被视为操作符而非方法,就像上面的should一样。