[闲聊] RSpec-Given 与 RSpec-Spies

楼主: hSATAC (cAt Ash)   2013-06-30 20:54:34
网页好读版:
http://blog.hsatac.net/2013/06/rspec-given-rspec-spies/
## RSpec/Given
[rspec-given](https://github.com/jimweirich/rspec-given) 其实是这次去新加坡
RedDotRubyConf 听 rake 的作者
jimweirich 介绍的。
乍看之下只是一个 syntax sugar,但实际用起来非常有帮助,可以有效的协助你写出干
净漂亮的测试。
rspec-given 提供了 `Given`,
`Then`, `When` 三个关键字以及其他一些额外的功能。 `Given` 类似原本的 `let`,而
`it` 则拆成 `Then` 和 `When`。
原本用 `it` 来写测试,一个 `it` 里面容易越写愈多,越写越肥,而且执行的程式码和
assertion 混在一起,不容易阅读。
用 `Given` 定义需要的东西、 `When` 写实际执行的程式码、 `Then` 放 assertion,
这样可以很方便、清楚的组织你的测试程式码。
此外还有 `And` 可以搭配 `Then` 使用,以及一个比较特别的 `Invariant`:当每次
`Then` 被执行到的时候都会跑这个 assertion。
## RSpec-Spies
我们现在把测试分很明显的三个区块 `Given`, `Then`, `When` 以后,就会碰到一个问
题叫 `should_receive`。
以往 `should_receive` 这件事是跟在 mock method 一起做的,这语句本身就同时有
`Then` 和 `When` 的涵义在。而且整段测试会变成前面有 assertion, 中间一段执行程
式码,后面又是 assertion ,使的整个阅读性大大降低。
并且,我们一般人思考的顺序是“我做了什么事” → “得到什么结果”。而
`should_receive` 是要写在真正执行的程式码前面的,跟我们思考的顺序恰好相反,容
易混淆。所以我们需要有一个语法能把 mock 跟 assertion(should_receive) 这两件事
分开。
这时候就可以使用
[rspec-spies](https://github.com/technicalpickles/rspec-spies)。
这样我们就可以把 `have_receieved` 当成一般的 matcher 搬到 `Then` 区块,整段测
试就很清楚明了。
更好的是这个语法在 RSpec 2.14 就会内建支援,所以现在先使用这个 gem ,等 RSpec
2.14 正式 release 以后再拿掉即可无缝衔接。
## 延伸阅读
* [RSpec/Given
Tutorial](https://github.com/jimweirich/rspec-given/wiki/Tutorial)
* [Test Spy Pattern](http://xunitpatterns.com/Test%20Spy.html)
作者: goodplace (hello)   2013-07-26 01:46:00
感谢分享! 这算是参考Cucumber的语法吧
楼主: hSATAC (cAt Ash)   2013-07-27 00:07:00
应该算 BDD 的固定 pattern?

Links booklink

Contact Us: admin [ a t ] ucptt.com