Rails Tips[1] - RSpec


学习Rails的过程中,陆续整理一些笔记,供以后参考.

安装

修改Gemfile, 在development, test group中加上rspec-rails gem

NOTE: 注意需要同时加到 development, test两个group, 我曾经仅仅添加到 test group中,但后续 rails generate model时, 不会生成rspec的测试文件.

group :development, :test do
  gem 'rspec-rails', '~> 3.0'
end

下载并安装gem

$ bundle install
# Initialize the spec/ directory (where specs will reside) with:
$ rails generate rspec:install

参考: rspec-rails 文档

如何用rspec 代替默认的 测试框架

方法一 新建Rails App时传递参数

# 第一种方法: 传递 --skip-test-unit
$ rails new sample_app --skip-test-unit
# 第二种方法: 传递 -T 参数
$ rails new sample_app -T

后续在调用 rails generate model等命令都不会生成测试相关的, 后续可以手动添加. 如何手动添加, 见下文.

参考:

方法二 后续补救

如果新建App时候, 忘记传递 –skip-test-unit参数时, 怎么办?

# 首先删除 rails new时候, 默认生成的test目录
$ cd project/path
$ rm -rf test
# 参照安装部分, 修改Gemfile, 同时在development, test group中加入 rspec-rails后, bundle install
$ rails generate rspec:install
# 后续rails generate model时会自动生成rspec spec file

手动生成spec

# will create a new spec file in spec/models/widget_spec.rb.
$ rails generate rspec:model widget

类似的还有: 代替 rspec:model中的model即可.

  • scaffold
  • model
  • controller
  • helper
  • view
  • mailer
  • observer
  • integration
  • feature
  • job

参考: Rspec文档 - Generators

何时需要手动生成?

有时候, 在生成controller时, 不想生成默认的spec测试, 例如, controller 一般用 Request Spec / Feature Spec来测试, 默认生成的controller spec就不太合适.

# 传入 --no-test-framework 不会生成 rspec/test-unit的测试文件
$ rails generate controller StaticPages --no-test-framework
# 手动生成Feature Spec测试
$ rails generate rspec:feature static_pages

Request spec vs Feature spec

相比单元测试, 这两个更多的是集成测试,或者说黑盒测试.

简单的说,

个人认为Fature spec一般用于页面测试. 是完全的黑盒子, 是在模拟用户操作浏览器, 访问页面, 填充表单, 点击按钮.

而 Request spec则多用于API的测试, 使用http 的 get, post等动作, 当然, 也可以用填充表单的一些api, 我们这里, 更多的是在说如何更规范的使用rspec.

Rails rspec默认的集成测试是Request spec, 在 Rails tutorial中用的就是 Request spec.

参考:

## 参考