TDD with RSpec出错集之单元测试篇

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。