第ä¸æ¥ å®è£
rspecårspec-railså¨å½ä»¤è¡ä¸æ§è¡å¦ä¸å½ä»¤ï¼
$ sudo gem install rspec v = 1.3.0
$ sudo gem install rspec-rails v = 1.3.2
å®è£
å®æåï¼è¿å
¥railsåºç¨æå¨çç®å½ï¼è¿è¡å¦ä¸èæ¬ï¼çæspecæµè¯æ¡æ¶ï¼
$ script/generate rspec
exists lib/tasks
identical lib/tasks/rspec.rake
identical script/autospec
identical script/spec
exists spec
identical spec/rcov.opts
identical spec/spec.opts
identical spec/spec_helper.rb
第äºæ¥ å®è£
factory-girlå¨å½ä»¤è¡ä¸æ§è¡å¦ä¸å½ä»¤ï¼
ç¸å
³ååå
容
ç¾åº¦ç 究é¢é«çº§ç§å¦å®¶è°å¤§è§æ¨¡æºå¨å¦ä¹ ææ¯ å¤©ç«å端å¼åä¸å®¶é¬¼é解读Native å Web èå ãæ·±å
¥æµ
åºNode.jsãä½è
æ´çµä¸»æQConå
¨æ å¼åä¸é¢ ç¥ä¹èååå§äººå
¼ CTOåºåQConç¥å移å¨æ¡ä¾ä¸é¢ â伤çå¨éª¨ä¸ç¾å¤©â-大åç»ç»è½¬åå®ä¾åæ ç¸å
³èµå©å
å
¨ç软件å¼å大ä¼ï¼4æ23-25æ¥ï¼å京ï¼æ¬è¯·æå¾
ï¼
$ sudo gem install factory-girl
å¨config/environment/test.rbä¸ï¼å å
¥factory-girlè¿ä¸ªgemï¼
config.gem "factory_girl"
å¨spec/ç®å½ä¸ï¼å¢å ä¸ä¸ªfactories.rbçæ件ï¼ç¨äºææé¢å
å®ä¹çmodelå·¥åã
第ä¸æ¥ å®è£
autotestå¨å½ä»¤è¡ä¸æ§è¡å¦ä¸å½ä»¤ï¼
$ sudo gem install ZenTest
$ sudo gem install autotest-rails
ç¶å设置ä¸RSpecçéæï¼å¨railsåºç¨çç®å½ä¸ï¼è¿è¡å¦ä¸çå½ä»¤ï¼å°±å¯ä»¥æ¾ç¤ºæµè¯ç¨ä¾çè¿è¡ç»æã
RSPEC=true autotest or autospec
å¨èªå·±çhomeç®å½ä¸ï¼å¢å ä¸ä¸ª.autotest设置ææçRailsåºç¨çautotestæ件ãå½ç¶ï¼ä¹å¯ä»¥æè¿ä¸ªæ件å å°æ¯ä¸ªåºç¨çæ ¹ç®å½ä¸ï¼è¿ä¸ªæ件å°è¦çhomeç®å½ä¸çæ件设置ãautotestçæ件å¾å¤ï¼ç¬è
ç¨å°å¦ä¸çpluginï¼
$ sudo gem install autotest-growl
$ sudo gem install autotest-fsevent
$ sudo gem install redgreen
设置.autotestæ件ï¼å¨.autotestä¸ï¼å å
¥å¦ä¸ä»£ç ã
require 'autotest/growl'
require 'autotest/fsevent'
require 'redgreen/autotest'
Autotest.add_hook :initialize do |autotest|
%w{.git .svn .hg .DS_Store ._* vendor tmp log doc}.each do |exception|
autotest.add_exception(exception)
end
end
æµè¯ç»éªå®è£
äºå¿
è¦çç¨åºåºä»¥åï¼å°±å¯ä»¥åæµè¯ä»£ç äºãæ¬ä¾ä¸ï¼ææåºç¨é½æ¯å¨Rails 2.3.4ä¸å¼åçï¼RSpecéç¨çæ¯1.3.0ççæ¬ã为äºå¾å¥½ç说æé®é¢ï¼æ们åå®è¿æ ·çéæ±ï¼å¤æä¸ä¸ªç¨æ·å¨ä¸ä¸ªæ¶é´æ®µå
æ¯å¦è¿å°ãåæµè¯ä»£ç æ¶é½æ¯éµå¾ªä¸ä¸ªååï¼åªå
³å¿è¾å
¥åè¾åºï¼å
·ä½çå®ç°å¹¶ä¸å¨æµè¯ä»£ç çèèèå´ä¹å
ï¼æ¯è¡ä¸ºé©±å¨å¼åãæ ¹æ®è¿ä¸ªéæ±ï¼æ们å°ä¼è®¾è®¡æ¹æ³absence_at(start_time,end_time)ï¼æ两个è¾å
¥å¼start_timeåend_time以åä¸ä¸ªè¾åºå¼ï¼ç±»åæ¯booleanã对åºçæµè¯ä»£ç å¦ä¸ï¼
describe "User absence or not during [start_time,end_time]" do
before :each do
@user = Factory(:user)
end
it "should return false when user not absence " do
start_time = Time.utc(2010,11,9,12,0,0,0)
end_time = Time.utc(2010,11,9,12,30,0)
@user.absence_at(start_time,end_time).should be_false
end
it "should return true when user absence " do
start_time = Time.utc(2010,11,9,13,0,0,0)
end_time = Time.utc(2010,11,9,13,30,0)
@user.absence_at(start_time,end_time).should be_ture
end
end
æµè¯ä»£ç å·²ç»å®æãè³äºabsence_atæ¹æ³æ们并ä¸å
³å¿å®çå®ç°ï¼åªè¦è¿ä¸ªæ¹æ³çç»æè½è®©æµè¯ä»£ç è¿è¡ç»ææ£ç¡®å°±å¯ä»¥ãå¨æ¤æµè¯ä»£ç çåºç¡ä¸ï¼å°±å¯ä»¥å¤§èå°å»å®æ代ç ï¼å¹¶æ ¹æ®æµè¯ä»£ç çç»æä¸æä¿®æ¹ä»£ç ç´å°æææµè¯ç¨ä¾éè¿ã
Stubç使ç¨åæµè¯ä»£ç ï¼æ好é¦å
ä»modelå¼å§ãå 为modelçæ¹æ³è½å¾å¥½ä¸è¾å
¥è¾åºçååå»åï¼å®¹æä¸æãæåçæ¶åï¼ä½ ä¼åç°mockåstubå¾å¥½ç¨ï¼ä»»ä½ç对象é½å¯ä»¥mockï¼å¹¶ä¸å¨å®çåºç¡ä¸å¯ä»¥stubä¸äºæ¹æ³ï¼çå»æé æ°æ®ç麻ç¦ï¼ä¸åº¦è®©ç¬è
è§å¾æµè¯ä»£ç æ¯å¦æ¤ç¾ä¸½ï¼ä¸æ¥æ¥çæ·±å
¥ï¼æåç°èªå·±é·å
¥äºstubç误åºãè¿æ¯å¼ç¨ä¸é¢çä¾åï¼æ们ç代ç å®ç°å¦ä¸ï¼
class User < ActiveRecord::Base
def absence_at(start_time,end_time)
return false if have_connection_or_review?(start_time,end_time)
return (login_absence_at?(start_time,end_time) ? true : false)
end
end
æç
§æååæµè¯ä»£ç çæè·¯ï¼æ¬æ¹æ³ä¸åå¨ä¸ç§æ
åµï¼å³éè¦ä¸ä¸ªç¨ä¾ï¼èä¸è¿è°ç¨äºå
¶ä»ä¸¤ä¸ªæ¹æ³ï¼éè¦å¯¹ä»ä»¬è¿è¡stubï¼äºæ¯å°±æäºä¸é¢çæµè¯ä»£ç ãè®°å¾å½æ¶å®æåè¿å¾å
´å¥ï¼å¿ä¸è¿æ³ï¼è¿ä¹åæµè¯ä»£ç çæ趣ã
before(:each) do
@user = User.new
end
describe "method <absence_at(start_time,end_time)>" do
s = Time.now
e = s + 30.minutes
# example one
it "should be false when user have interaction or review" do
@user.stub!(:have_connection_or_review?).with(s,e).and_return(true)
@user.absence_at(s,e).should be_false
end
# example two
it "should be true when user has no interaction and he no waiting at platform" do
@user.stub!(:have_connection_or_review?).with(s,e).and_return(false)
@user.stub!(:login_absence_at?).with(s,e).and_return(true)
@user.absence_at(s,e).should be_true
end
# example three
it "should be false when user has no interaction and he waiting at platform" do
@user.stub!(:have_connection_or_review?).with(s,e).and_return(false)
@user.stub!(:login_absence_at?).with(s,e).and_return(false)
@user.absence_at(s,e).should be_false
end
end
ä¸é¢çæµè¯ä»£ç ï¼æ¯å
¸åæ代ç çå®ç°ç»è带å°äºæµè¯ä»£ç ä¸ï¼å®å
¨æ¯æ¬æ«åç½®çãå½ç¶è¿ä¸ªæµè¯ä»£ç è¿è¡çæ¶åï¼ç»æé½æ¯æ£ç¡®çãé£æ¯å 为ç¨stubæ¥åå®ææçåæ¹æ³é½æ¯å¯¹çï¼ä½æ¯å¦æè¿ä¸ªåæ¹æ³have_connection_or_review?åçååï¼å®ä¸è¿åbooleanå¼ï¼é£ä¹å°ä¼åçä»ä¹å¢ï¼è¿ä¸ªæµè¯ä»£ç ä¾ç¶æ£ç¡®ï¼å¯æå§ï¼è¿é½æ²¡æèµ·å°æµè¯ä»£ç çä½ç¨ã
å¦å¤ï¼å¦ææ¯è¿æ ·ï¼æ们ä¸ä»
è¦ä¿®æ¹have_connection_or_review?çæµè¯ä»£ç ï¼èä¸è¿è¦ä¿®æ¹absence_atçæµè¯ä»£ç ãè¿ä¸æ¯å¨å¢å¤§ä»£ç ç»´æ¤éåï¼
ç¸æ¯èè¨ï¼ä¸ç¨stubçæµè¯ä»£ç ï¼ä¸ç¨ä¿®æ¹ï¼å¦æFactoryçæ°æ®æ²¡æåçååï¼é£ä¹æµè¯ä»£ç çç»æå°æ¯é误çï¼å 为have_connection_or_review?没æéè¿æµè¯ï¼å¯¼è´absence_atæ¹æ³æ æ³æ£å¸¸è¿è¡ã
å
¶å®stub主è¦æ¯mockä¸äºæ¬æ¹æ³æè
æ¬åºç¨ä¸æ æ³å¾å°ç对象ï¼æ¯å¦å¨tech_finish?æ¹æ³ä¸ï¼è°ç¨äºä¸ä¸ªfile_serviceæ¥è·å¾Record对象çæææ件ï¼å¨æ¬æ¹æ³æµè¯ä»£ç è¿è¡è¿ç¨ä¸ï¼æ æ³å¾å°è¿ä¸ªserviceï¼è¿æ¶stub就起ä½ç¨äºï¼
class A < ActiveRecord::Base
has_many :records
def tech_finish?
self.records.each do |v_a|
return true if v_a.files.size == 5
end
return false
end
end
class Record < ActiveRecord::Base
belongs_to :a
has_files # here is a service in gem
end
æ对åºçæµè¯ä»£ç å¦ä¸ï¼
describe "tech_finish?" do
it "should return true when Aâs records have five files" do
record = Factory(:record)
app = Factory(:a,:records=>[record])
record.stub!(:files).and_return([1,2,3,4,5])
app.tech_finish?.should == true
end
it "should return false when Aâs records have less five files" do
record = Factory(:record)
app = Factory(:a,:records=>[record])
record.stub!(:files).and_return([1,2,3,5])
app.tech_finish?.should == false
end
end
Factoryç使ç¨æäºè¿ä¸ªå·¥åï¼å¯ä»¥å¾æ¹ä¾¿çæé ä¸åç模ææ°æ®æ¥è¿è¡æµè¯ä»£ç ãè¿æ¯ä¸é¢çä¾åï¼å¦æè¦æµè¯absence_atæ¹æ³ï¼æ¶åå°å¤ä¸ªmodelï¼
•HistoryRecordï¼Userçä¸è¯¾è®°å½
•Calendarï¼Userç课ç¨è¡¨
•Loggingï¼Userçæ¥å¿ä¿¡æ¯
å¦æä¸ç¨factory-girlæé æµè¯æ°æ®ï¼æ们å°ä¸å¾ä¸å¨fixtureæé è¿äºæµè¯æ°æ®ãå¨fixtureæé çæ°æ®æ æ³æå®æ¯é£ä¸ªæµè¯ç¨ä¾ä½¿ç¨ï¼ä½æ¯å¦æç¨Factoryçè¯ï¼å¯ä»¥ä¸ºè¿ä¸ªæ¹æ³ä¸é¨æå®ä¸ç»æµè¯æ°æ®ã
Factory.define :user_absence_example,:class => User do |user|
user.login "test"
class << user
def default_history_records
[Factory.build(:history_record,:started_at=>Time.now),
Factory.build(:history_record,:started_at=>Time.now)]
end
def default_calendars
[Factory.build(:calendar),
Factory.build(:calendar)]
end
def default_loggings
[Factory.build(:logging,:started_at=>1.days.ago),
Factory.build(:logging,:started_at=>1.days.ago)]
end
end
user.history_records {default_history_records}
user.calendars {default_calendars}
user.loggings {default_loggings}
end
è¿ä¸ªæµè¯æ°æ®çæé å·¥åï¼å¯ä»¥æ¾å¨factories.rbæ件ä¸ï¼æ¹ä¾¿å
¶ä»æµè¯ç¨ä¾ä½¿ç¨ï¼ä¹å¯ä»¥ç´æ¥æ¾å°æµè¯æ件çbeforeä¸ï¼ä»
ä¾æ¬æµè¯æ件使ç¨ãéè¿factoryçæé ï¼ä¸ä»
å¯ä»¥ä¸ºå¤ä¸ªæµè¯ç¨ä¾å
±äº«åä¸ç»æµè¯æ°æ®ï¼èä¸æµè¯ä»£ç ä¹ç®æ´æäºã
before :each do
@user = Factory.create(:user_absence_example)
end
温馨提示:答案为网友推荐,仅供参考