TDD 学习笔记。
写在前面
刷完了Edx上关于TDD,BDD的课程,也看了《Everyday rails testing with RSpec》, 于是迫不及待想给自己的网站Together也加上RSpec部分,好比刚从师傅那学了几招的小徒弟,立马想找个人试试身手,这中间自然也是免不了各种坑的,一一记录, 避免二次入坑。
PS : FactoryGirl官方GitHub库已经改名为FactoryBot,实作的时候,请小心敲键盘……
正文
ArgumentError: Factory not registered
运行测试文件时,终端报出这样的错误:
怎么破?
在
spec/spec_helper.rb
文件中,加入如下:RSpec.configure do |config| config.include FactoryBot::Syntax::Methods ..... + config.before do + FactoryBot.find_definitions + end end
FactoryBot::DuplicateDefinitionError: Factory already registered: event
运行测试文件时,终端报出这样的错误:
怎么破?
在
spec/spec_helper.rb
文件中,加入如下:RSpec.configure do |config| config.include FactoryBot::Syntax::Methods ..... config.before do + FactoryBot.factories.clear FactoryBot.find_definitions end end
Please set Qiniu’s access_key and secret_key before authorize any tokens
终端运行
rspec spec/controllers/events_controller_spec.rb
, 为了测试events controller部分,用FactoryBot创建了event,这里有必要说一下,我的event model中有logo部分,而用户上传的logo图片我是用七牛来存储的。抛出异常,查看七牛官方GitHub spec部分,找到了这个:我擦,看完了
spec/qiniu/tokens/auth_spec.rb
,除了懵逼外,我不知道怎么走下一步,转念想想我这里并不要测试七牛这块啊,我只想测试controller中的method是不是调用了,so what should I do? bypass it。修改
app/uploads/
下所有的uploader文档,比如avatar_uploader.rb, 修改storage设置:
除了生产环境,开发和测试请一律使用file存储!再次测试, 一线飘绿,OK!
NoMethodError: Undefined method ‘sign_in’
怎么破?
google后,在stack overflow上找到了解答。
修改
spec/support/rails_helper.rb
文件,在RSpec.configure do |config|
部分添加config.include Devise::TestHelpers, type: :controller
:RSpec.configure do |config| ...... + config.include Devise::TestHelpers, type: :controller ...... end
再次测试, pass!
如果你的model中有图片部分,比如event model中有个event logo,而你用factoryBot生成数据时,是这样的:
同时,你在测试案例中要用到build(:event),那么,先要恭喜你,新坑正在等在你。
我在做controller的create method测试时,一直报错:
设置断点后,找到了是eventlogo没有赋值成功:
Google后,你会发现stack overflow上已经有人问过类似的了,但是各执一词,让人有些摸不着头脑,有说用fixture_file_upload的,呃,fixture VS FactoryBot, 我们更爱后者。那怎么破?
看carrierwave的GitHub文档找到Use test factories部分:
重点来了:
原来我用的那种格式,是用于create的,如果用build,只存在内存中,则需要换成
Rack::Test::UploadedFile.new
的样式。修改
spec/factories/events.rb
文件,将原eventlogo注释掉:
终端再次运行:rspec spec/controllers/events_controller_spec.rb
, OK !
The End
按照TDD「Test driven development」的理论,应该测试先行, 像下图酱样子:
无奈我已经做好了整个网站,决定不按套路出牌,后期加入TDD,来测测前期代码的稳定性 , 在测了一部分功能后,深有感触,测试果然是很有必要的:P。