当我们以BDD的方式来开发的时候,我们会遵循Red Green Refactor的循环来开发功能。
我们会一开始编写很多spec group,但是,我们会一个个的去实现每个spec。这时候,一开始添加的spec就需要借助RSpec的pending功能将未实现的spec标记失败,但又不影响已实现的spec group的执行结果。
从description开始
定义spec时候,对于尚未实现的,只需添加描述皆可,如:
it 'is light in color'
it 'is cooler than 200 degrees Fahrenheit'
上述spec没有实现。运行时,未实现的spec会以星号(*)表示,如:
从输出结果可以看到,未实现的spec运行时会被划归未pending分类下,并显示的告知 Not yet implemented。
标记半成品
对于部分实现的spec,可以在block内添加pending函数,pending函数前的部分还是会被RSpec执行并输出成功还是失败的,pending后的部分也会运行,但结果不会影响整个测试执行的结果。pending函数可以添加在block中的任何位置,如:
执行rspec命令后:
上述的rspec的运行结果可以看出,pending spec的运行结果虽然是失败的,但是并未统计在最终的测试执行结果里。pending spec在最终的测试结果里被标记为星号(*)表示尚未完成。
渐进完成
使用pending标记未完成的spec而不是直接注释掉的好处在于,随着pending spec中涉及的功能的实现,pending spec会被标记为失败,并在最终的测试执行结果中展示出来,提醒我们去删除掉pending,同时,表示我们功能开发的进度。
如上述rspec的输出结果中,2个pending spec失败的原因在于涉及的方法未实现(NoSuchMethod),当2个方法均实现后,再运行rspec,结果如下:
可以看到,带有pending的2个spec再次执行后,被标记失败,同时结果反应到了整个的测试执行结果中。当删除2个pending方法后,再次运行,所有的spec执行成功。
skip
如果不想让spec执行,可以用skip函数替换pending函数。也可以在it前标记x,即xit。类似fit,只是xit表示跳过spec的执行,而不是’focus‘它。
Content mainly from 「Effective testing with Rspec 3」by Myron Maston, Ian Dees