这里的rails测试主要用到了以下技术,rspec, simplecovh和factory,simplecov是用来检测测试代码对被测试代码覆盖的工具,factory_girl_rails是用来做单元测试的,它可以创建单元测试所需的临时数据,而会将这些临时数据存如数据库。
在初始测试时,应该首先同步测试数据库和开发数据库的表和属性,应用以下命令
rake db:migrate
rake db:test:prepare
rake db:test:load
当然在以后更新测试数据库元素时,可以直接输入以下命令行
‘RAILS_ENV=test bundle exec rake db:migrate’
运行测试的一些命令行:
rspec spec //运行全部测试
rspec spec filepath //运行某个文件
rspec spec filepath -e 'describe name' //运行一个故事,当然还有比较常用的tag
关于测试的一些小结
1. 测试model
测试内容主要是两部分,一个是model里定义的函数,还有一个就是某一个field的要求,比如
class Article < ActiveRecord::Base
validates :title, presence: true
def self.get_computer_article
return where(article_type = 'computer')
end
end
以上需要确保title总是不为空,get_computer_article可以获取到computer类型的文章
describe 'test model Article' do
it 'test' do
article = Article.new
expect(article.save).to eq(false)
create(:article,
article_type:'computer',title:'test1') expect(Article.get_computer.first.article_type).to eq('computer')
end
end
- 测试controller
controller主要测试以下5个部分: - web request?
//this is for 200 response
expect(response).to be_success
expect(response).to have_http_status(200)
- redirect to the right page?
expect(response).to render_template("index")
//或者
expect(response).to redirect_to(test_path(var1,var2))
//对于render :nothing=>true的情况
expect(response).to have_text(" ")
- authenticated successfully?
- object stored in the template?
expect(assigns(:something).id).to eq(1)
- appropriate message show in the view?
以下是几种触发请求事件的方式
//请求方式,函数名,传递的参数
//对应url root/index?some_var=value
get :index, some_var: value
//对应url root/13/edit?some_var=value
get :edit, {'id' => '13'},{'some_var' => 'value'}
//对应url root/new?some_var=value
get :new, {'some_var' => 'value'}
//当然如果是xhr可以这样写
xhr :get, :edit, {'id' => '13'},{'some_var' => 'value'}
//对应url root/create, other_var可通过form,或者ajax传递过来
post :create {'other_var' => 'value'}
//对应url root/update/13, other_var同上
patch :update, :id=>13, :other_var=>'value'
此外ruby里有以下集中数据:
assigns:@something, assigns(:something)
cookies, cookies[:person_id]
session, session[:person_id]
flash, flash[:message] flash是function之间传递的参数
- 测试helper方法类似
- 测试js代码和html
如果想更好的测试html和js需要用到capybara-webkit,这些会在后边介绍
额外补充一条
allow_any_instance_of(Object).to receive(:function).and_return(somthing)
当使用Object.function时,返回something