Dongfeng Gu

【译】Rails测试:如何给Rails项目初始化Rspec

- 4 mins

参考链接

link(本文为参考链接的非官方中文翻译版本,并非完全对照翻译,减少了原文中不必要的内容)

说明

这片文章将会一步一步来教大家如何初始化rspec将rspec集成到Rails的项目当中

文章正文:

要想充分的使用rspec,除了主要的 rspec-rails gem,我们还需要使用到以下三个gems:

首先让我们把相应的gem添加到Gemfile当中(因为上述的四个gems全部都是用于测试,所以我们可以把gems添加到 :development:test 的组当中),参考一下的Gemfile文件:

# Gemfile

source 'https://rubygems.org'

gem 'rails', '4.2.5'
gem 'pg', '~> 0.15'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc

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

group :development do
  gem 'web-console', '~> 2.0'

  gem 'spring'
end

参考 :development, :test 模块

gem 'rspec-rails', '~> 3.0'
gem 'capybara'
gem 'database_cleaner'

通过运行命令 bundle 安装需要的gem之后,我们使用rspec的命令来安装 RSpec

rails generate rspec:install

这个命令将会创建相应的rspec配置文件

create  .rspec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

下一步我们将需要配置 rails_helper.rb 文件来使 capybaraDatabaseCleaner 运作:

# spec/rails_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)

abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
require 'capybara/rails'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = false
  config.before(:suite) { DatabaseCleaner.clean_with(:truncation) }
  config.before(:each) { DatabaseCleaner.strategy = :transaction }
  config.before(:each, :js => true) { DatabaseCleaner.strategy = :truncation }
  config.before(:each) { DatabaseCleaner.start }
  config.after(:each) { DatabaseCleaner.clean }
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end

以上的配置文件对比默认的配置文件作出了一下的修改:

至此我们已经完成了相应的配置,下面让我们写一个测试文件来测试我们可以访问主页。创建一个目录 features 和文件 static

# spec/features/static_spec.rb

require 'rails_helper'

describe 'navigate' do
  describe 'homepage' do
    it 'can be reached successfully' do
      visit root_path
      expect(page.status_code).to eq(200)
    end
  end
end

运行命令 rspec 将会出现错误 NameError: undefined local variable or method root_path' for #RSpec::ExampleGroups::Navigate::Homepage:0x007fa73f05eef0:

Alt Text

我们可以通过修改 routes.rb 文件来修复这个错误:

# config/routes.rb

Rails.application.routes.draw do
  root to: 'static#home'
end

再次运行 rspec 命令,我们将会遇到另外一个错误因为我们没有创建 static 控制器(controller),然后错误提示还是会说无法识别 root_path,所以让我们手动创建 static 控制器:

# app/controllers/static_controller.rb

class StaticController < ApplicationController
end

现在我们再次运行 rspec 命令,我们将会获得另外一个错误消息就是 AbstractController::ActionNotFound: The action 'home' could not be found for StaticController

Alt Text

我们可以通过给添加 home index:

# app/controllers/static_controller.rb

class StaticController < ApplicationController
  def home
  end
end

当我们再次运行 rspec 命令, 我们将会遇到错误 ActionView::MissingTemplate: Missing template static/home 这是因为我们没有创建模板文件,现在让我们在 app/views/static 目录下创建文件 app/views/static/home.html.erb

现在当我们运行命令 rspec 时,测试通过:

Alt Text

在测试文件 spec/features/static_spec.rb

至此改教程结束

comments powered by Disqus
rss facebook twitter github youtube mail spotify instagram linkedin google pinterest medium vimeo