这可能是一个天真的问题,但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/
答案 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
一样。