日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

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

開(kāi)發(fā)解耦代碼

一種解決方法是:書(shū)寫(xiě)的代碼是獨(dú)立的,元件盡可能的與系統(tǒng)分離。用另外的話說(shuō),就是寫(xiě)SOLID Rails 代碼。舉一個(gè)特殊的例子,可以直接寫(xiě)一個(gè)類模塊去創(chuàng)建一個(gè)事例。而不是使用依賴的插入的方法去去除涉及到類的硬編碼。我們僅僅需要去保證:我們安全的采用模塊符號(hào)或者懶惰的評(píng)價(jià)去得到默認(rèn)的引用。以下是一個(gè)服務(wù),它需要在ActiveRecord模塊中創(chuàng)建一個(gè)小工具。我們采用懶惰的評(píng)價(jià)去介入的方法來(lái)替換直接的引用工具類。這可以解耦我們的代碼,同時(shí)不需要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)你采用這種方式寫(xiě)代碼時(shí),你可以開(kāi)始重新組織怎么建立自己的規(guī)范和最小化環(huán)境需求來(lái)運(yùn)行這些規(guī)范和滿足規(guī)則需求的代碼。典型spec_helper.rb會(huì)有一個(gè)如下的一行代碼:

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

這個(gè)將會(huì)載入整個(gè)的Rails程序且降低測(cè)試運(yùn)行速度。為了讓規(guī)范達(dá)到更快的速度,可以使用一個(gè)不含有上面那行代碼的配置文件。那么讓我們開(kāi)始創(chuàng)建一個(gè)輕量級(jí)的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' 

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

簡(jiǎn)單的Ruby對(duì)象說(shuō)明

取決于你指定的應(yīng)用程序部分,你可以在任意一個(gè)上下文中創(chuàng)建一個(gè)你所需要的輔助細(xì)則。例如,最簡(jiǎn)單的是指定一個(gè)任意類型的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" 

裝飾說(shuō)明

于你的裝飾而言,你可能會(huì)選擇布商,你的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ī)范

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

特點(diǎn)說(shuō)明

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

作為總結(jié)

我自己也開(kāi)始在項(xiàng)目中加入這些改變并且這也讓我能用更加簡(jiǎn)單的代碼去完成一個(gè)項(xiàng)目. 你們可以在Github上找到:https://github.com/Originate/rails_spec_harness

當(dāng)在項(xiàng)目中引入這些變化時(shí)候,我發(fā)現(xiàn)速度至少增長(zhǎng)了8-12倍. 變化最大的一個(gè)項(xiàng)目竟然增長(zhǎng)了27倍同時(shí)也包括了這些對(duì)應(yīng)的編程效率上的提高.舉個(gè)例子,我開(kāi)始寫(xiě)一個(gè)含有4個(gè)簡(jiǎn)單例子的Ruby類. 然后我使用time命令行工具去衡量運(yùn)行的效率,并且之后我能得到如下的結(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

寫(xiě)牛逼的代碼,隔離你的單獨(dú)模塊,然后,享受編碼的樂(lè)趣吧。

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


網(wǎng)站名稱:提升你的RailsSpecs性能10倍
網(wǎng)站URL:http://m.5511xx.com/article/dpocodd.html