这是我发现比较快速的方法,从头至尾,一共10步,很适合新手一步步照着做。
1、新建工程时不使用test-unit
1 | rails new myapp --skip-test-unit |
2、添加gem
修改Gemfile
1 | group :development , :test do |
安装
3、配置rspec
1 | rails generate rspec :install |
会生成以下文件:
.rspec rspec配置。
spec/ 所有测试都在这个目录。
spec/spec_helper.rb
此时即可”bundle exec rspec spec/”或“rake”来执行RSpec测试。
4、Spork加速原理
RSpec默认每执行一次都要加载一次工程环境初始化一些数据,这要耗费很长时间。Sprok启动时会自动加载工程环境,然后生成几个fork分支,以DRb形式可供RSpec调用。所有在RSpec执行时就不必再重新加载工程环境。
5、安装Spork
输出
2 | Bootstrapping /Users/peter/dev/rails/myapp/spec/spec_helper.rb. |
3 | Done. Edit /Users/peter/dev/rails/myapp/spec/spec_helper.rb now with your favorite text editor and follow the instructions. |
上面做的就是修改spec/spec_helper.rb文件,在其头部添加了两段方法。Spork.prefork(只在启动时执行一次)和Spork.each_run(每次被RSpec调用时均被执行)。
6、修改RSpec配置,实现RSpec与Sprok交互
继续修改spec/spec_helper.rb,修改后大概如下:
4 | ENV [ "RAILS_ENV" ] ||= 'test' |
5 | require File .expand_path( "../../config/environment" , __FILE__ ) |
7 | require 'rspec/autorun' |
9 | Dir [Rails.root.join( "spec/support/**/*.rb" )]. each {|f| require f} |
11 | RSpec.configure do |config| |
12 | config.mock_with :rspec |
13 | config.fixture_path = "#{::Rails.root}/spec/fixtures" |
14 | config.use_transactional_fixtures = true |
15 | config.infer_base_class_for_anonymous_controllers = false |
21 | load "#{Rails.root}/config/routes.rb" |
22 | Dir [ "#{Rails.root}/app/**/*.rb" ]. each { |f| load f } |
7、告诉RSpec我们使用的Spork
修改”.rspec”文件,在其中添加–drb,修改后”.rspec”的如下:
8、此时RSpec与Spork即可完美结合了
启动Spork方法
执行RSpec方法
1 | bundle exec rspec spec/ |
此时会发现RSpec执行时间明显缩短了。但如果通过执行”rake”来启动RSpec,仍然会很慢,这是因为rake启动时会加载工程环境,为所有tasks做准备。
9、添加Autotest自动执行测试
启动Autotest
Autotest就会自动启动,并监听文件变化,一旦改变,会立即执行改变部分相关的测试。
添加Autotest是最简单的,这是因为RSpec内部已经添加了对Autotest的一些支持,也是Rspec Rails推荐的做法。
简单也有一些问题,如Autotest自定义性不强,不够灵活。如果你追求自定义那就用Watchr吧。
10、一个陷阱
此时当你修改app/models/person.rb时,可能并不会自动执行RSpec测试,这是因为Rails 的test环境默认对class做了缓存。
修改“config/environments/test.rb”
3 | config.cache_classes = false |
参考链接:
autotest-rails: https://github.com/seattlerb/autotest-rails
rspec-rails: https://github.com/rspec/rspec-rails
watchr: https://github.com/mynyml/watchr
Spork + Rails 3 + RSpec + Autotest + Growl实现Mac下快速自动化测试并Growl通知测试结果
http://mikbe.tk/2011/02/10/blazingly-fast-tests/
Spork + Rails 3 + RSpec + Watchr测试
http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html
Spork + Rails 3+ Cucumber + RSpec
http://chrismdp.github.com/2010/11/getting-spork-working-now-on-rails-3-rspec-2-and-cucumber/