日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
提升你的RailsSpecs性能10倍

人們疏于在Rails開發(fā)應(yīng)用中去駕馭規(guī)范的一個基本的原因是運行的規(guī)范套件所需要的時間。很多工具可以用來緩和這個麻煩,比如 Spork ,  Zeus 和  Spring。事實上,Rails 4.1將會在春季推出標(biāo)準(zhǔn)。不幸的是,這些工具僅僅是解決問題癥狀的 一個拐杖,而不是解決問題本身。實際的問題是書寫耦合度高的代碼需要有一個完整的Rails的架構(gòu)支撐,這個架構(gòu)會緩慢啟動。

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都服務(wù)器托管小微創(chuàng)業(yè)公司專業(yè)提供成都定制網(wǎng)頁設(shè)計營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

開發(fā)解耦代碼

一種解決方法是:書寫的代碼是獨立的,元件盡可能的與系統(tǒng)分離。用另外的話說,就是寫SOLID Rails 代碼。舉一個特殊的例子,可以直接寫一個類模塊去創(chuàng)建一個事例。而不是使用依賴的插入的方法去去除涉及到類的硬編碼。我們僅僅需要去保證:我們安全的采用模塊符號或者懶惰的評價去得到默認(rèn)的引用。以下是一個服務(wù),它需要在ActiveRecord模塊中創(chuàng)建一個小工具。我們采用懶惰的評價去介入的方法來替換直接的引用工具類。這可以解耦我們的代碼,同時不需要ActiveRecord載入。

 
 
  1. # A tightly coupled class. We don't want this.  
  2. class MyService  
  3.   def create_widget(params)  
  4.     Widget.create(params)  
  5.   end 
  6. end 
  7.  
  8. # We can inject in the initializer  
  9. class MyService  
  10.   attr_reader :widget_factory  
  11.  
  12.   def initialize(dependencies={})  
  13.     @widget_factory = dependencies.fetch(:widget_factory) { Widget }  
  14.   end 
  15.  
  16.   def create_widget(params)  
  17.     widget_factory.create(params)  
  18.   end 
  19. end 
  20.  
  21. # Or we can explictly inject via a setter with a lazy reader  
  22. class MyService  
  23.   attr_writer :widget_factory  
  24.  
  25.   def widget_factory  
  26.     @widget_factory ||= Widget  
  27.   end 
  28.  
  29.   def create_widget(params)  
  30.     widget_factory.create(params)  
  31.   end 
  32. end 
  33.  
  34. # A specification injecting the dependency using the second method  
  35. describe MyService do  
  36.   subject(:service) { MyService.new }  
  37.   let(:widget_factory) { double 'widget_factory', create: nil }  
  38.   before { service.widget_factory = widget_factory }  
  39.  
  40.   it 'creates a widget with the factory' do  
  41.     service.create_widget({name: 'sprocket'})  
  42.     expect(widget_factory).to have_received(:create).with({name: 'sprocket'})  
  43.   end 
  44. end 

當(dāng)你采用這種方式寫代碼時,你可以開始重新組織怎么建立自己的規(guī)范和最小化環(huán)境需求來運行這些規(guī)范和滿足規(guī)則需求的代碼。典型spec_helper.rb會有一個如下的一行代碼:

 
 
  1. require File.expand_path("../../config/environment", __FILE__)  

這個將會載入整個的Rails程序且降低測試運行速度。為了讓規(guī)范達(dá)到更快的速度,可以使用一個不含有上面那行代碼的配置文件。那么讓我們開始創(chuàng)建一個輕量級的rb包:base_sepc_helper.rb:

 
 
  1. ENV["RAILS_ENV"] ||= 'test' 
  2. require 'rubygems' 
  3.  
  4. RAILS_ROOT = File.expand_path('../..', __FILE__)  
  5. Dir[File.join(RAILS_ROOT, 'spec/support/**/*.rb')].each {|f| require f}  
  6.  
  7. RSpec.configure do |config|  
  8.   config.mock_with :rspec 
  9.   config.order = 'random' 
  10.   # Your prefered config options go here  
  11. end 
  12.  
  13. require 'active_support' 
  14. require 'active_support/dependencies' 

我們通過請求active_support和active_support/dependencies包來訪問Rails使用的自動裝載機,實際上并沒有導(dǎo)入所有的Rails。它是相當(dāng)?shù)妮p量級并且方便性超過了損耗。在每個需要這個base包的helper里,我們將會添加我們程序相對應(yīng)的部分到ActiveSupport::Dependencies.autoload_paths中。

簡單的Ruby對象說明

取決于你指定的應(yīng)用程序部分,你可以在任意一個上下文中創(chuàng)建一個你所需要的輔助細(xì)則。例如,最簡單的是指定一個任意類型的Ruby純類作為服務(wù)類。如下面services_spec_helper.rb例子

 
 
  1. require 'base_spec_helper' 
  2. Dir[File.join(RAILS_ROOT, "spec/support_services/**/*.rb")].each {|f| require f}  
  3. ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/services" 

裝飾說明

于你的裝飾而言,你可能會選擇布商,你的decorators_spec_helper.rb就如以下所看到的。

 
 
  1. require 'base_spec_helper' 
  2. require 'draper' 
  3. Draper::ViewContext.test_strategy :fast 
  4. Dir[File.join(RAILS_ROOT, "spec/support_decorators/**/*.rb")].each {|f| require f}  
  5. ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/decorators" 

模塊規(guī)范

測試模塊還需要做一點事情. 假設(shè)你現(xiàn)在正在用ActiveRecord你會需要建立一個和數(shù)據(jù)庫的連接. 我們并不需要將defactory_girl或者database_cleaner加入你的測試中,而且并不會真的創(chuàng)建對象. 實際上,唯一需要進行創(chuàng)建數(shù)據(jù)庫對象的地方就是當(dāng)你進行特定對象測試的時候.當(dāng)你確實需要創(chuàng)建一些對象的時候,你只需要手動的進行清理和轉(zhuǎn)換. 這就是一個樣例models_spec_helper.rb:

 
 
  1. require 'base_spec_helper' 
  2. require 'active_record' 
  3. # RSpec has some nice matchers for models so we'll pull them in  
  4. require 'rspec/rails/extensions/active_record/base' 
  5. Dir[File.join(RAILS_ROOT, "spec/support_models/**/*.rb")].each {|f| require f}  
  6.  
  7. # Manually connect to the database  
  8. ActiveRecord::Base.establish_connection(  
  9.   YAML.load(File.read(RAILS_ROOT + '/config/database.yml'))['test']  
  10. )  
  11.  
  12. ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/models" 

特點說明

最后, 當(dāng)我們創(chuàng)建特色應(yīng)用時, 我們會需要Rails全套知識并且feature_spec_helper.rb看起來就和spec_helper.rb差不多了.

作為總結(jié)

我自己也開始在項目中加入這些改變并且這也讓我能用更加簡單的代碼去完成一個項目. 你們可以在Github上找到:https://github.com/Originate/rails_spec_harness

當(dāng)在項目中引入這些變化時候,我發(fā)現(xiàn)速度至少增長了8-12倍. 變化最大的一個項目竟然增長了27倍同時也包括了這些對應(yīng)的編程效率上的提高.舉個例子,我開始寫一個含有4個簡單例子的Ruby類. 然后我使用time命令行工具去衡量運行的效率,并且之后我能得到如下的結(jié)果,F(xiàn)ULL Rails VS MINIMAL:

Spec Helper Real User Sys RSpec Reported
Full Rails4.913s2.521s1.183s0.0706s
Minimal0.492s0.407s0.080s0.0057s

寫牛逼的代碼,隔離你的單獨模塊,然后,享受編碼的樂趣吧。

英文原文:Speed Up Your Rails Specs by 10x


文章題目:提升你的RailsSpecs性能10倍
文章出自:http://www.dlmjj.cn/article/dpocodd.html