锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲Av熟妇高潮30p,亚洲一区爱区精品无码,亚洲精品美女久久久久9999http://www.tkk7.com/lzj520/category/26946.htmlzh-cnTue, 20 Nov 2007 10:19:09 GMTTue, 20 Nov 2007 10:19:09 GMT60071719 rspec鍦╪etbeans IED 6 beta涓婅繍琛屾椂鐨勪竴浜涢棶棰?/title><link>http://www.tkk7.com/lzj520/archive/2007/11/19/161635.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Mon, 19 Nov 2007 07:45:00 GMT</pubDate><guid>http://www.tkk7.com/lzj520/archive/2007/11/19/161635.html</guid><wfw:comment>http://www.tkk7.com/lzj520/comments/161635.html</wfw:comment><comments>http://www.tkk7.com/lzj520/archive/2007/11/19/161635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/lzj520/comments/commentRss/161635.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/lzj520/services/trackbacks/161635.html</trackback:ping><description><![CDATA[涓嶇煡鏄垜寮勯敊浜嗕粈涔堝湴鏂癸紝榪樻槸鏈潵灝辨槸榪欐牱鐨勶紝鍦╪etbeans IED 6 beta榪愯rspec鏃訛紝鍋囧鍏堟槸鍏堣繍琛宻caffold_resource錛岀劧鍚庢寜鐓spec瀹樻柟鐨勬枃妗g殑鏂規(guī)硶鏉ュ畨瑁卹spec銆乺spec_on_rails錛屽茍榪愯rspec銆乺spec_model錛岀劧鑰屾鏃訛紝嫻嬭瘯榛樿鐢熸垚鐨刴odel錛屽氨浼?xì)寰楀埌绫讳计D繖鏍風(fēng)殑閿欒鎻愮ず錛?br /> 1.0.1/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:34:in `require': no such file to load -- E:/NetBeansProjects/RailsApplication2/spec/models/../../vendor/generators/rspec/lib/rspec_on_rails (MissingSourceFile)<br /> 姝ゆ椂鎵撳紑spec_helper.rb錛屽彂鐜皉spec_on_rails鐨勮繖涓璺緞榛樿鏄笉瀵圭殑錛岄渶瑕佹墜宸ユ妸瀹冭緗負(fù)姝g‘鐨勮礬寰勩傛垨鑰呮垜璇曡繃鎶婅繖鍙ヨ礬寰勭殑寮曠敤鐩存帴鍒犻櫎鎺夛紝濂藉儚涔熷彲浠ャ?br /> <br /> 澶勭悊瀹岃繖涓姝ヤ箣鍚庯紝浼?xì)閬囧埌鐨勮窡鐫鐨勮繖鏍蜂竴涓敊璇彁紺猴細(xì)<br /> spec/models/../spec_helper.rb:9: undefined local variable or method `use_transactional_fixtures=' for Spec::Runner::Context:Class (NameError)<br /> 榪欓渶瑕佷綘鍘籺est_helper.rb閲屽姞鍏ヤ竴鍙equire File.expand_path(File.dirname(__FILE__) + "/test2spec_help")錛屾妸use_transactional_fixtures鍔犲叆榪涙潵銆傜劧鍚庡湪spec_helper.rb閲屽姞鍏equire File.expand_path(File.dirname(__FILE__) + "/../test/test_helper")<br /> <br /> 鐒跺悗鎵嶈兘姝e紡鐪嬪埌1 example, 1 failure榪欐牱姣旇緝姝e父鐨勬彁紺恒備笉鐭ユ槸鍚︽垜鎿嶄綔閿欒錛岃繕鏄粈涔堥棶棰橈紝鎬諱箣灝辨槸紕板埌浜嗚繖鏍蜂竴榪炰覆鐨勯棶棰? 鑰岃繖涓В鍐沖姙娉曚篃涓嶇煡鏄惁姝g‘ <img src ="http://www.tkk7.com/lzj520/aggbug/161635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lzj520/" target="_blank">lzj520</a> 2007-11-19 15:45 <a href="http://www.tkk7.com/lzj520/archive/2007/11/19/161635.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>071030 涓涓猨mock瀹炰緥http://www.tkk7.com/lzj520/archive/2007/10/30/156839.htmllzj520lzj520Tue, 30 Oct 2007 01:18:00 GMThttp://www.tkk7.com/lzj520/archive/2007/10/30/156839.htmlhttp://www.tkk7.com/lzj520/comments/156839.htmlhttp://www.tkk7.com/lzj520/archive/2007/10/30/156839.html#Feedback0http://www.tkk7.com/lzj520/comments/commentRss/156839.htmlhttp://www.tkk7.com/lzj520/services/trackbacks/156839.html 棣栧厛寤虹珛嫻嬭瘯鐢ㄤ緥錛?br />

public class PlaceOrderServiceTests extends MockObjectTestCase{

 Mockery context = new Mockery();
   
    public void testUpdateRestaurant_good() throws Exception{
     //setup
     PlaceOrderService service = new PlaceOrderService();
     final RestaurantRepository restaurantRepository  =  context.mock(RestaurantRepository.class);
     final String restaurantId = "1";
     final String pendingOrderId = "1";
     //expectations
     context.checking(new Expectations(){{
      allowing(restaurantRepository).findRestaurant(restaurantId,pendingOrderId);
      }});
     //execute
     service.updateRestaurant(restaurantId,pendingOrderId);
     //verify
     context.assertIsSatisfied();
    }
}
鐒跺悗鍒嗗埆寤虹珛鐩稿簲鐨勭被鍜屾帴鍙o細(xì)

public interface RestaurantRepository {

 Restaurant findRestaurant(String restaurantId, String pendingOrderId);

}

public class Restaurant {

}

public class PlaceOrderService {

 public void updateRestaurant(String restaurantId, String pendingOrderId) {
  // TODO Auto-generated method stub
  
 }

}



lzj520 2007-10-30 09:18 鍙戣〃璇勮
]]>
浣跨敤 RSpec 榪涜琛屼負(fù)椹卞姩嫻嬭瘯錛堣漿錛?/title><link>http://www.tkk7.com/lzj520/archive/2007/10/23/155374.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Tue, 23 Oct 2007 11:01:00 GMT</pubDate><guid>http://www.tkk7.com/lzj520/archive/2007/10/23/155374.html</guid><wfw:comment>http://www.tkk7.com/lzj520/comments/155374.html</wfw:comment><comments>http://www.tkk7.com/lzj520/archive/2007/10/23/155374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/lzj520/comments/commentRss/155374.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/lzj520/services/trackbacks/155374.html</trackback:ping><description><![CDATA[<blockquote>嫻嬭瘯鐑疆鐜板湪浼犳挱鍒頒簡 Ruby 緙栫▼紺懼尯錛屽茍涓旀剤婕旀剤鐑傚湪榪囧幓涓騫撮噷錛屾祴璇曢鍩熶腑鏈涓虹灘鐩殑鍒涙柊搴斿睘 RSpec 鐨勫紩鍏ュ拰蹇熷彂灞曪紝榪欐槸涓縐嶈涓洪┍鍔ㄦ祴璇曞伐鍏楓傞氳繃鏈枃浜嗚В RSpec 濡備綍鏀瑰彉浜轟滑鎬濊冩祴璇曠殑鏂瑰紡銆?</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--> <p>鍦ㄨ繃鍘誨崄騫翠腑錛岃蔣浠跺紑鍙戜漢鍛樺嫻嬭瘯鐨勭儹鎯呮棩娓愪綆榪楓傚悓涓鏃舵湡鍑虹幇鐨勫姩鎬佽璦騫舵病鏈夋彁渚涚紪璇戠▼搴忔潵鎹曟崏鏈鍩烘湰鐨勯敊璇紝榪欎嬌寰楁祴璇曞彉寰楁洿鍔犻噸瑕併傞殢鐫嫻嬭瘯紺懼尯鐨勬垚闀匡紝寮鍙戜漢鍛樺紑濮嬫敞鎰忓埌錛岄櫎浜嗘崟鑾?bug 絳夋渶鍩烘湰鐨勪紭鐐瑰錛屾祴璇曡繕鍏鋒湁浠ヤ笅浼樺娍錛?/p> <ul> <li>嫻嬭瘯鑳藉鏀硅繘鎮(zhèn)ㄧ殑璁捐銆傝繘琛屾祴璇曠殑姣忎釜鐩爣瀵硅薄蹇呴』鍏峰鑷沖皯涓や釜瀹㈡埛鏈猴細(xì)鐢熶駭浠g爜鍜屾祴璇曠敤渚嬨傝繖浜涘鎴鋒満寮哄埗鎮(zhèn)ㄥ浠g爜榪涜瑙h︺傛祴璇曡繕榧撳姳寮鍙戜漢鍛樹嬌鐢ㄦ洿灝忋佹洿綆鍗曠殑鏂規(guī)硶銆? <li>嫻嬭瘯鍑忓皯浜嗕笉蹇呰鐨勪唬鐮併傚湪緙栧啓嫻嬭瘯鐢ㄤ緥鏃訛紝鎮(zhèn)ㄥ吇鎴愪簡寰堝ソ鐨勬祴璇曚範(fàn)鎯紝鍗沖彧緙栧啓榪愯嫻嬭瘯鐢ㄤ緥鎵闇鐨勬渶灝戜唬鐮併傛?zhèn)ㄦ姷鍒朵綇浜嗗鍔熻兘杩涜缂栫爜鐨勮鎯戝Q屽洜涓烘?zhèn)ㄧ洰鍓崢q樹笉闇瑕佸畠銆? <li>鎺ㄥ姩浜嗘祴璇曚紭鍏堝紑鍙戙傛?zhèn)ň~栧啓鐨勬瘡涓祴璇曠敤渚嬩細(xì)紜畾涓涓皬闂銆備嬌鐢ㄤ唬鐮佽В鍐寵繖涓棶棰橀潪甯告湁鐢ㄥ茍涓斿彲浠ユ帹鍔ㄥ紑鍙戙傚綋鎴戣繘琛屾祴璇曢┍鍔ㄥ紑鍙戞椂錛屾椂闂磋繃寰楅蹇? <li>嫻嬭瘯鎻愪緵浜嗘洿澶氱殑鑷富鏉冦傚湪浣跨敤嫻嬭瘯鐢ㄤ緥鎹曡幏鍙兘鐨勯敊璇椂錛屾?zhèn)ㄤ細(xì)鍙戠幇鑷繁闈炲父鎰挎剰瀵逛唬鐮仒q涜鏀硅繘銆?</li> </ul> <p><a name="N10062"><span id="lvvhbhd" class="atitle">嫻嬭瘯椹卞姩鐨勫紑鍙戝拰 RSpec</span></a></p> <p>鏈夊叧嫻嬭瘯鐨勪紭鐐規(guī)棤闇璧樿堪錛屾垜灝嗗悜鎮(zhèn)ㄤ粙緇嶄竴涓畝鍗曠殑浣跨敤 RSpec 鐨勬祴璇曢┍鍔ㄥ紑鍙戠ず渚嬨俁Spec 宸ュ叿鏄竴涓?Ruby 杞歡鍖咃紝鍙互鐢ㄥ畠鏋勫緩鏈夊叧鎮(zhèn)ㄧ殑杞歡鐨勮鑼冦傝瑙勮寖瀹為檯涓婃槸涓涓弿榪扮郴緇熻涓虹殑嫻嬭瘯銆備嬌鐢?RSpec 鐨勫紑鍙戞祦紼嬪涓嬶細(xì)</p> <ul> <li>緙栧啓涓涓祴璇曘傝嫻嬭瘯鎻忚堪緋葷粺涓煇涓緝?yōu)畯鍏冪礌鐨勮湄?fù)銆? <li>榪愯嫻嬭瘯銆傜敱浜庡皻娌℃湁涓虹郴緇熶腑鐨勭浉搴旈儴鍒嗘瀯寤轟唬鐮侊紝嫻嬭瘯澶辮觸銆傝繖涓閲嶈姝ラ灝嗘祴璇曟?zhèn)ㄧ殑娴嬭瘯鐢ㄤ緥锛寢個楠屾祴璇曠敤渚嬫槸鍚﹀湪搴斿綋澶辮觸鐨勬椂鍊欏け璐ャ? <li>緙栧啓瓚沖鐨勪唬鐮侊紝浣挎祴璇曢氳繃銆? <li>榪愯嫻嬭瘯錛屾楠屾祴璇曟槸鍚︽垚鍔熴?</li> </ul> <p>瀹炶川涓婏紝RSpec 寮鍙戜漢鍛樻墍鍋氱殑宸ヤ綔灝辨槸灝嗗け璐ョ殑嫻嬭瘯鐢ㄤ緥璋冭瘯涓烘垚鍔熺殑嫻嬭瘯鐢ㄤ緥銆傝繖鏄竴涓富鍔ㄧ殑榪囩▼銆傛湰鏂囦腑錛屾垜灝嗕粙緇?RSpec 鐨勫熀鏈敤娉曘?</p> <p>棣栧厛錛屽亣璁炬?zhèn)ㄥ凡瀹夎浜?Ruby 鍜?gems銆傛?zhèn)q橀渶瑕佸畨瑁?RSpec銆傝緭鍏ヤ笅闈㈢殑鍐呭錛?</p> <p><code>gem install rspec</code> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <br /> <br /> <p><a name="N10086"><span id="phndjdl" class="atitle">浣跨敤紺轟緥</span></a></p> <p>鎺ヤ笅鏉ワ紝鎴戝皢閫愭鏋勫緩涓涓姸鎬佹満銆傛垜灝嗛伒寰?TDD 瑙勫垯銆傞鍏堢紪鍐欒嚜宸辯殑嫻嬭瘯鐢ㄤ緥錛屽茍涓旂洿鍒版祴璇曠敤渚嬮渶瑕佹椂鎵嶇紪鍐欎唬鐮併俁ake 鐨勫垱寤鴻?Jim Weirich 璁や負(fù)榪欐湁鍔╀簬瑙掕壊鎵紨銆傚湪緙栧啓瀹為檯鐨勭敓浜т唬鐮佹椂錛屾?zhèn)ㄥ笇鏈涘厖褰撲竴鍥?jerk 寮鍙戜漢鍛樼殑瑙掕壊錛屽彧瀹屾垚鏈灝戦噺鐨勫伐浣滄潵浣挎祴璇曢氳繃銆傚湪緙栧啓嫻嬭瘯鏃訛紝鎮(zhèn)ㄥ垯鎵紨嫻嬭瘯浜哄憳鐨勮鑹詫紝璇曞浘涓哄紑鍙戜漢鍛樻彁渚涗竴浜涙湁鐩婄殑甯姪銆?/p> <p>浠ヤ笅鐨勭ず渚嬪睍紺轟簡濡備綍鏋勫緩涓涓姸鎬佹満銆傚鏋滄?zhèn)ㄤ互鍓嶄粠鏈帴瑙q囩姸鎬佹満錛岃鏌ラ槄 <a >鍙傝冭祫鏂?/a>銆傜姸鎬佹満鍏鋒湁澶氱鐘舵併傛瘡縐嶇姸鎬佹敮鎸佸彲浠ヨ漿鎹㈢姸鎬佹満鐘舵佺殑浜嬩歡銆傛祴璇曢┍鍔ㄥ紑鍙戝叆闂ㄧ殑鍏抽敭灝辨槸浠庨浂鍏ユ墜錛屽敖閲忓皯鍦頒嬌鐢ㄥ亣璁炬潯浠躲傞拡瀵規(guī)祴璇曡繘琛岀▼搴忚璁°?/p> <p>浣跨敤娓呭崟 1 鐨勫唴瀹瑰垱寤哄悕涓?machine_spec.rb 鐨勬枃浠躲傝鏂囦歡灝辨槸鎮(zhèn)ㄧ殑瑙勮寖銆傛?zhèn)q樹笉浜嗚В machine.rb 鏂囦歡鐨勪綔鐢紝鐩墠鍏堝垱寤轟竴涓┖鏂囦歡銆?/p> <br /> <a name="listing1"><strong>娓呭崟 1. 鏈鍒濈殑 machine_spec.rb 鏂囦歡 </strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> require 'machine' </pre> </td> </tr> </tbody> </table> <br /> <p>鎺ヤ笅鏉ワ紝闇瑕佽繍琛屾祴璇曘傚緇堥氳繃杈撳叆 <code>spec machine_spec.rb</code> 榪愯嫻嬭瘯銆傛竻鍗?2 灞曠ず浜嗛鏂欎箣涓殑嫻嬭瘯澶辮觸錛?/p> <br /> <a name="listing2"><strong>娓呭崟 2. 榪愯絀虹殑瑙勮寖</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">~/rspec batate$ spec machine_spec.rb /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- machine (LoadError) from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from ./state_machine_spec.rb:1 from ... </pre> </td> </tr> </tbody> </table> <br /> <p>鍦ㄦ祴璇曢┍鍔ㄥ紑鍙戜腑錛屾?zhèn)ㄩ渶瑕佽繘琛屽閲忓紑鍙戯紝鍥犳鍦ㄨ繘琛屼笅涓嬈″紑鍙戝墠錛岄渶瑕佸厛瑙e喅姝ゆ嫻嬭瘯鍑虹幇鐨勯棶棰樸傜幇鍦紝鎴戝皢鎵紨 jerk 寮鍙戜漢鍛樼殑瑙掕壊錛屽嵆鍙畬鎴愭弧瓚沖簲鐢ㄧ▼搴忚繍琛屾墍闇鐨勬渶灝戝伐浣滈噺銆傛垜灝嗗垱寤轟竴涓悕涓?machine.rb 鐨勭┖鏂囦歡錛屼嬌嫻嬭瘯閫氳繃銆傛垜鐜板湪鍙互浠ラ稿緟鍔籌紝嫻嬭瘯閫氳繃鑰屾垜鍑犱箮娌″仛浠諱綍浜嬫儏銆?/p> <p>緇х畫瑙掕壊鎵紨銆傛垜鐜板湪鎵紨涓涓儲韜佺殑嫻嬭瘯浜哄憳錛屼績浣?jerk 寮鍙戜漢鍛樺仛浜涘疄闄呯殑宸ヤ綔銆傛垜灝嗙紪鐮佷互涓嬭鑼冿紝闇瑕佷嬌鐢?<code>Machine</code> 綾伙紝濡傛竻鍗?3 鎵紺猴細(xì)</p> <br /> <a name="listing3"><strong>娓呭崟 3. 鍒濆瑙勮寖</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">require 'machine' describe Machine do before :each do @machine = Machine end end </pre> </td> </tr> </tbody> </table> <br /> <p>璇ヨ鑼冩弿榪頒簡鐩墠灝氫笉瀛樺湪鐨?<code>Machine</code> 綾匯?code>describe</code> 鏂規(guī)硶鎻愪緵浜?RSpec 鎻忚堪錛屾?zhèn)畣浼犲叆娴嬭瘯绫荤殑鍚嵖U板拰鍖呭惈瀹為檯瑙勮寖鐨勪唬鐮佸潡銆傞氬父錛屾祴璇曠敤渚嬮渶瑕佹墽琛屼竴瀹氭暟閲忕殑璁劇疆宸ヤ綔銆傚湪 RSpec 涓紝灝嗙敱 <code>before</code> 鏂規(guī)硶瀹屾垚榪欎簺璁劇疆宸ヤ綔銆傛?zhèn)ㄥ?<code>before</code> 鏂規(guī)硶浼犻掍竴涓彲閫夌殑鏍囧織鍜屼竴涓唬鐮佸潡銆備唬鐮佸潡涓寘鍚緗伐浣溿傛爣蹇楃‘瀹?RSpec 鎵ц浠g爜鍧楃殑棰戠巼銆傞粯璁ょ殑鏍囧織涓?<code>:each</code>錛岃〃紺?RSpec 灝嗗湪姣忔嫻嬭瘯涔嬪墠璋冪敤 set up 浠g爜鍧椼傛?zhèn)ㄤ篃鍙互鎸囧?<code>:all</code>錛岃〃紺?RSpec 鍦ㄦ墽琛屾墍鏈夋祴璇曚箣鍓嶅彧璋冪敤涓嬈?<code>before</code> 浠g爜鍧椼傛?zhèn)ㄥ簲璇ュ缁堜娇鐢?<code>:each</code>錛屼嬌鍚勪釜嫻嬭瘯褰兼鐙珛銆?</p> <p>杈撳叆 <code>spec</code> 榪愯嫻嬭瘯錛屽娓呭崟 4 鎵紺猴細(xì) </p> <br /> <a name="listing4"><strong>娓呭崟 4. 瀛樺湪鎬ф祴璇曞け璐?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">~/rspec batate$ spec machine_spec.rb ./machine_spec.rb:3: uninitialized constant Machine (NameError) </pre> </td> </tr> </tbody> </table> <br /> <p>鐜板湪錛岀儲韜佺殑嫻嬭瘯浜哄憳瑕佷績浣?jerk 寮鍙戜漢鍛樺仛鐐逛粈涔堜簡 鈥?jerk 寮鍙戜漢鍛樼幇鍦ㄩ渶瑕佸垱寤烘煇涓被銆傚鎴戞潵璇達(dá)紝灝辨槸淇嫻嬭瘯鍑虹幇鐨勯敊璇傚湪 <code>machine.rb</code> 涓紝鎴戣緭鍏ユ渶灝戦噺鐨勪唬鐮侊紝濡傛竻鍗?5 鎵紺猴細(xì)</p> <br /> <a name="listing5"><strong>娓呭崟 5. 鍒涘緩鍒濆 Machine 綾?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">class Machine end</pre> </td> </tr> </tbody> </table> <br /> <p>淇濆瓨鏂囦歡錛岀劧鍚庤繍琛屾祴璇曘傛鏃犵枒闂紝娓呭崟 6 鏄劇ず鐨勬祴璇曟姤鍛婃病鏈夊嚭鐜伴敊璇細(xì)</p> <br /> <a name="listing6"><strong>娓呭崟 6. 嫻嬭瘯 Machine 鏄惁瀛樺湪</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">~/rspec batate$ spec machine_spec.rb Finished in 5.0e-06 seconds 0 examples, 0 failures </pre> </td> </tr> </tbody> </table> <br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <br /> <br /> <p><a name="N10116"><span id="xnfjnpf" class="atitle">緙栧啓琛屼負(fù)</span></a></p> <p>鐜板湪錛屾垜鍙互寮濮嬪疄鐜版洿澶氱殑琛屼負(fù)銆傛垜鐭ラ亾錛屾墍鏈夌姸鎬佹満蹇呴』鍦ㄦ煇浜涘垵濮嬬姸鎬佷笅鍚姩銆傜洰鍓嶆垜榪樹笉鏄緢娓呮濡備綍璁捐榪欎釜琛屼負(fù)錛屽洜姝ゆ垜鍏堢紪鍐欎竴涓潪甯哥畝鍗曠殑嫻嬭瘯錛岄鍏堝亣璁?<code>state</code> 鏂規(guī)硶浼?xì)杩斿?<code>:initial</code> 鏍囧織銆傛垜瀵?<code>machine_spec.rb</code> 榪涜淇敼騫惰繍琛屾祴璇曪紝濡傛竻鍗?7 鎵紺猴細(xì)</p> <br /> <a name="listing7"><strong>娓呭崟 7. 瀹炵幇鍒濆鐘舵佸茍榪愯嫻嬭瘯</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">require 'machine' describe Machine do before :each do @machine = Machine.new end it "should initially have a state of :initial" do @machine.state.should == :initial end end ~/rspec batate$ spec machine_spec.rb F 1) NoMethodError in 'Machine should initially have a state of :initial' undefined method `state' for #<Machine:0x10c7f8c> ./machine_spec.rb:9: Finished in 0.005577 seconds 1 example, 1 failure </pre> </td> </tr> </tbody> </table> <br /> <p>娉ㄦ剰榪欐潯瑙勫垯錛?code> it "should initially have a state of :initial" do @machine.state.should == :initial end</code>銆傞鍏堟敞鎰忓埌榪欐潯瑙勫垯璇昏搗鏉ュ儚鏄竴涓嫳鏂囧彞瀛愩傚垹闄ゆ爣鐐癸紝灝嗗緱鍒?<code>it should initially have a state of initial</code>銆傜劧鍚庝細(xì)娉ㄦ剰鍒拌繖鏉¤鍒欏茍涓嶅儚鏄吀鍨嬬殑闈㈠悜瀵硅薄浠g爜銆傚畠紜疄涓嶆槸銆傛?zhèn)ㄧ幇鍦ㄦ湁涓涓柟娉曪紝縐頒負(fù) <code>it</code>銆傝鏂規(guī)硶鍏鋒湁涓涓嬌鐢ㄥ紩鍙鋒嫭璧鋒潵鐨勫瓧絎︿覆鍙傛暟鍜屼竴涓唬鐮佸潡銆傚瓧絎︿覆搴旇鎻忚堪嫻嬭瘯闇姹傘傛渶鍚庯紝<code>do</code> 鍜?<code>end</code> 涔嬮棿鐨勪唬鐮佸潡鍖呭惈嫻嬭瘯鐢ㄤ緥鐨勪唬鐮併?</p> <p>鍙互鐪嬪埌錛屾祴璇曡繘搴﹀垝鍒嗗緱寰堢粏銆傝繖浜涘井灝忕殑姝ラ浜х敓鐨勬敹鐩婂嵈寰堝ぇ銆傚畠浠嬌鎴戣兘澶熸敼榪涙祴璇曞瘑搴︼紝鎻愪緵鏃墮棿渚涙垜鎬濊冩湡鏈涚殑琛屼負(fù)浠ュ強(qiáng)瀹炵幇琛屼負(fù)鎵闇鐨?API銆傝繖浜涙楠よ繕鑳戒嬌鎴戝湪寮鍙戞湡闂磋窡韙唬鐮佽鐩栨儏鍐碉紝浠庤屾瀯寤烘洿鍔犱赴瀵岀殑瑙勮寖銆?/p> <p>榪欑椋庢牸鐨勬祴璇曞叿鏈夊弻閲嶄綔鐢細(xì)嫻嬭瘯瀹炵幇騫跺湪嫻嬭瘯鐨勫悓鏃舵瀯寤洪渶姹傝璁℃枃妗c傜◢鍚庯紝鎴戝皢閫氳繃嫻嬭瘯鐢ㄤ緥鏋勫緩涓涓渶姹傚垪琛ㄣ?/p> <p>鎴戜嬌鐢ㄦ渶綆鍗曠殑鏂瑰紡淇浜嗘祴璇曪紝榪斿洖 <code>:initial</code>錛屽娓呭崟 8 鎵紺猴細(xì)</p> <br /> <a name="listing8"><strong>娓呭崟 8. 鎸囧畾鍒濆鐘舵?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">class Machine def state :initial end end </pre> </td> </tr> </tbody> </table> <br /> <p>褰撴煡鐪嬪疄鐜版椂錛屾?zhèn)ㄥ彲鑳戒細(xì)鏀惧0澶ЫW戞垨鎰熻鍙楀埌浜嗘剼寮勩傚浜庢祴璇曢┍鍔ㄥ紑鍙戯紝鎮(zhèn)ㄥ繀欏葷◢寰敼鍙樹竴涓嬫濊冩柟寮忋傛?zhèn)ㄧ殑鐩爣迤堜笉鏄~栧啓鏈緇堢殑鐢熶駭浠g爜錛岃嚦灝戠幇鍦ㄤ笉鏄傛?zhèn)ㄧ殑鐩爣鏄娇娴嬭瘯閫氳繃銆傚綋鎺屾彙浠ヨ繖縐嶆柟寮忓伐浣滄椂錛屾?zhèn)ㄥ彲鑳戒細(xì)鍙戠幇鏂扮殑瀹炵帋图岒q朵笖緙栧啓鐨勪唬鐮佽榪滆繙灝戜簬閲囩敤 TDD 鏃剁紪鍐欑殑浠g爜銆?/p> <p>涓嬩竴姝ユ槸榪愯浠g爜錛屾煡鐪嬪畠鏄惁閫氳繃嫻嬭瘯錛?/p> <br /> <a name="listing9"><strong>娓呭崟 9. 榪愯鍒濆鐘舵佹祴璇?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">~/rspec batate$ spec machine_spec.rb . Finished in 0.005364 seconds 1 example, 0 failures</pre> </td> </tr> </tbody> </table> <br /> <p>鑺變簺鏃墮棿鎬濊冧竴涓嬭繖涓氳繃嫻嬭瘯鐨勮凱浠c傚鏋滄煡鐪嬩唬鐮佺殑璇濓紝鎮(zhèn)ㄥ彲鑳戒細(xì)瑙夊緱姘旈銆傚洜涓哄茍娌℃湁鍙栧緱浠涔堣繘灞曘傚鏋滄煡鐪嬫暣涓凱浠o紝灝嗙湅鍒版洿澶氬唴瀹癸細(xì)鎮(zhèn)ㄦ崟鑾蜂簡涓涓噸瑕侀渶姹傚茍緙栧啓嫻嬭瘯鐢ㄤ緥瀹炵幇闇姹傘備綔涓轟竴鍚嶇▼搴忓憳錛屾垜鐨勭涓涓涓烘祴璇曞府鍔╂垜鏄庣‘浜嗗紑鍙戣繃紼嬨傚洜涓哄疄鐜扮粏鑺傞殢鐫嫻嬭瘯鐨勮繘琛岃秺鏉ヨ秺娓呮櫚銆?/p> <p>鐜板湪錛屾垜鍙互瀹炵幇涓涓洿鍋ュ.鐨勭姸鎬佸疄鐜般傚叿浣撴潵璁詫紝鎴戦渶瑕佸鐞嗙姸鎬佹満鐨勫涓姸鎬併傛垜闇瑕佸垱寤轟竴涓柊鐨勮鍒欒幏鍙栨湁鏁堢姸鎬佸垪琛ㄣ傚儚浠ュ墠涓鏍鳳紝鎴戝皢榪愯嫻嬭瘯騫舵煡鐪嬫槸鍚﹂氳繃銆?/p> <br /> <a name="listing10"><strong>娓呭崟 10. 瀹炵幇鏈夋晥鐘舵佽鑼?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> it "should remember a list of valid states" do @machine.states = [:shopping, :checking_out] @machine.states.should = [:shopping, :checking_out] end run test(note: failing first verifies test) ~/rspec batate$ spec machine_spec.rb .F 1) NoMethodError in 'Machine should remember a list of valid states' undefined method `states=' for #<Machine:0x10c7154> ./machine_spec.rb:13: Finished in 0.005923 seconds 2 examples, 1 failure</pre> </td> </tr> </tbody> </table> <br /> <p>鍦ㄦ竻鍗?10 涓紝鍑虹幇浜嗕竴涓?RSpec 褰㈠紡鐨勬柇璦銆傝鏂█浠?<code>should</code> 鏂規(guī)硶寮濮嬶紝鐒跺悗娣誨姞浜嗕竴浜涙瘮杈冨叧緋匯?code>should</code> 鏂規(guī)硶瀵瑰簲鐢ㄧ▼搴忚繘琛屾煇縐嶈瀵熴傚伐浣滀腑鐨勫簲鐢ㄧ▼搴忓簲璇ヤ互鏌愮鏂瑰紡榪愯銆?code>should</code> 鏂規(guī)硶寰堝ソ鍦版崟鑾蜂簡榪欑闇姹傘傚湪鏈緥涓紝鎴戠殑鐘舵佹満搴旇璁板繂涓ょ涓嶅悓鐨勭姸鎬併?/p> <p>鐜板湪錛屽簲璇ユ坊鍔犱竴涓疄渚嬪彉閲忔潵瀹為檯璁板繂鐘舵併傚儚浠ュ線涓鏍鳳紝鎴戝湪淇敼浠g爜鍚庤繍琛屾祴璇曠敤渚嬶紝騫惰瀵熸祴璇曟槸鍚︽垚鍔熴?/p> <br /> <a name="listing11"><strong>娓呭崟 11. 鍒涘緩涓涓睘鎬т互璁板繂鐘舵?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">class Machine attr_accessor :states def state :initial end end ~/rspec batate$ spec machine_spec.rb .. Finished in 0.00606 seconds 2 examples, 0 failures</pre> </td> </tr> </tbody> </table> <br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <br /> <br /> <p><a name="N10199"><span id="ffvzvvn" class="atitle">椹卞姩閲嶆瀯</span></a></p> <p>姝ゆ椂錛屾垜騫朵笉鎯沖喅瀹氬皢 <code>:initial</code> 鐘舵佺О涓虹姸鎬佹満鐨勭涓涓姸鎬併傜浉鍙嶏紝鎴戞洿甯屾湜絎竴涓姸鎬佹槸鐘舵佹暟緇勪腑鐨勭涓涓厓绱犮傛垜瀵圭姸鎬佹満鐨勭悊瑙e湪涓嶆柇婕斿彉銆傝繖縐嶇幇璞″茍涓嶅皯瑙併傛祴璇曢┍鍔ㄥ紑鍙戠粡甯歌揩浣挎垜閲嶆柊鑰冭檻涔嬪墠鐨勫亣璁俱傜敱浜庢垜宸茬粡閫氳繃嫻嬭瘯鐢ㄤ緥鎹曡幏浜嗘棭鏈熼渶姹傦紝鎴戝彲浠ヨ交鏉懼湴瀵逛唬鐮佽繘琛岄噸鏋勩傚湪鏈緥涓紝閲嶆瀯灝辨槸瀵逛唬鐮佽繘琛岃皟鏁達(dá)紝浣垮叾鏇村ソ鍦板伐浣溿?/p> <p>淇敼絎竴涓祴璇曪紝浣垮叾濡傛竻鍗?12 鎵紺猴紝騫惰繍琛屾祴璇曪細(xì)</p> <br /> <a name="listing12"><strong>娓呭崟 12. 鍒濆鐘舵佸簲璇ヤ負(fù)鎸囧畾鐨勭涓涓姸鎬?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">it "should initially have a state of the first state" do @machine.states = [:shopping, :checking_out] @machine.state.should == :shopping end ~/rspec batate$ spec machine_spec.rb F. 1) 'Machine should initially have a state of the first state' FAILED expected :shopping, got :initial (using ==) ./machine_spec.rb:10: Finished in 0.005846 seconds 2 examples, 1 failure</pre> </td> </tr> </tbody> </table> <br /> <p>鍙互榪欐牱璇達(dá)紝嫻嬭瘯鐢ㄤ緥璧峰埌浣滅敤浜嗭紝鍥犱負(fù)瀹冭繍琛屽け璐ワ紝鍥犳鎴戠幇鍦ㄩ渶瑕佷慨鏀逛唬鐮佷互浣垮叾宸ヤ綔銆傛樉鑰屾槗瑙侊紝鎴戠殑浠誨姟灝辨槸浣挎祴璇曢氳繃銆傛垜鍠滄榪欑嫻嬭瘯鐩殑錛屽洜涓烘垜鐨勬祴璇曠敤渚嬫鍦ㄩ┍鍔ㄦ垜榪涜璁捐銆傛垜灝嗘妸鍒濆鐘舵佷紶閫掔粰 <code>new</code> 鏂規(guī)硶銆傛垜灝嗗瀹炵幇紼嶄綔淇敼錛屼互絎﹀悎淇敼鍚庣殑瑙勮寖錛屽娓呭崟 13 鎵紺恒?/p> <br /> <a name="listing13"><strong>娓呭崟 13. 鎸囧畾鍒濆鐘舵?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">start to fix it class Machine attr_accessor :states attr_reader :state def initialize(states) @states = states @state = @states[0] end end ~/rspec batate$ spec machine_spec.rb 1) ArgumentError in 'Machine should initially have a state of the first state' wrong number of arguments (0 for 1) ./machine_spec.rb:5:in `initialize' ./machine_spec.rb:5:in `new' ./machine_spec.rb:5: 2) ArgumentError in 'Machine should remember a list of valid states' wrong number of arguments (0 for 1) ./machine_spec.rb:5:in `initialize' ./machine_spec.rb:5:in `new' ./machine_spec.rb:5: Finished in 0.006391 seconds 2 examples, 2 failures</pre> </td> </tr> </tbody> </table> <br /> <p>鐜板湪錛屾祴璇曞嚭鐜頒簡涓浜涢敊璇傛垜鎵懼埌浜嗗疄鐜頒腑鐨勪竴浜?bug銆傛祴璇曠敤渚嬩笉鍐嶄嬌鐢ㄦ紜殑鎺ュ彛錛屽洜涓烘垜娌℃湁鎶婂垵濮嬬姸鎬佷紶閫掔粰鐘舵佹満銆傚彲浠ョ湅鍒幫紝嫻嬭瘯鐢ㄤ緥宸茬粡璧峰埌浜嗕繚鎶や綔鐢ㄣ傛垜榪涜浜嗚緝澶х殑鏇存敼錛屾祴璇曞氨鍙戠幇浜?bug銆傛垜浠渶瑕佸嫻嬭瘯榪涜閲嶆瀯浠ュ尮閰嶆柊鐨勬帴鍙o紝灝嗗垵濮嬬姸鎬佸垪琛ㄤ紶閫掔粰 <code>new</code> 鏂規(guī)硶銆傚湪榪欓噷鎴戝茍娌℃湁閲嶅鍒濆鍖栦唬鐮侊紝鑰屾槸灝嗗叾鏀劇疆鍦?<code>before</code> 鏂規(guī)硶涓紝濡傛竻鍗?14 鎵紺猴細(xì)</p> <br /> <a name="listing14"><strong>娓呭崟 14. 鍦?“before” 涓垵濮嬪寲鐘舵佹満 </strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">require 'machine' describe Machine do before :each do @machine = Machine.new([:shopping, :checking_out]) end it "should initially have a state of the first state" do @machine.state.should == :shopping end it "should remember a list of valid states" do @machine.states.should == [:shopping, :checking_out] end end ~/rspec batate$ spec machine_spec.rb .. Finished in 0.005542 seconds 2 examples, 0 failures</pre> </td> </tr> </tbody> </table> <br /> <p>鐘舵佹満寮濮嬮愭笎鎴愬瀷銆備唬鐮佷粛鐒舵湁涓浜涢棶棰橈紝浣嗘槸姝e湪鍚戣壇濂界殑鏂瑰悜婕斿寲銆傛垜灝嗗紑濮嬪鐘舵佹満榪涜涓浜涜漿鎹€傝繖浜涜漿鎹㈠皢淇冧嬌浠g爜瀹為檯璁板繂褰撳墠鐘舵併?/p> <p>嫻嬭瘯鐢ㄤ緥淇冧嬌鎴戝叏闈㈠湴鎬濊?API 鐨勮璁°傛垜闇瑕佺煡閬撳浣曡〃紺轟簨浠跺拰杞崲銆傞鍏堬紝鎴戝皢浣跨敤涓涓暎鍒楄〃琛ㄧず杞崲錛岃屾病鏈変嬌鐢ㄦ垚鐔熺殑闈㈠悜瀵硅薄瀹炵幇銆傞殢鍚庯紝嫻嬭瘯闇姹傚彲鑳戒細(xì)瑕佹眰鎴戜慨鏀瑰亣璁炬潯浠訛紝浣嗘槸鐩墠錛屾垜浠嶇劧淇濇寔榪欑綆鍗曟с傛竻鍗?15 鏄劇ず浜嗕慨鏀瑰悗鐨勪唬鐮侊細(xì)</p> <br /> <a name="listing15"><strong>娓呭崟 15. 娣誨姞浜嬩歡鍜岃漿鎹?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">remember events... change before conditions require 'machine' describe Machine do before :each do @machine = Machine.new([:shopping, :checking_out]) @machine.events = {:checkout => {:from => :shopping, :to => :checking_out}} end it "should initially have a state of the first state" do @machine.state.should == :shopping end it "should remember a list of valid states" do @machine.states.should == [:shopping, :checking_out] end it "should remember a list of events with transitions" do @machine.events.should == {:checkout => {:from => :shopping, :to => :checking_out}} end end ~/rspec batate$ spec machine_spec.rb FFF 1) NoMethodError in 'Machine should initially have a state of the first state' undefined method `events=' for #<Machine:0x10c6f38> ./machine_spec.rb:6: 2) NoMethodError in 'Machine should remember a list of valid states' undefined method `events=' for #z7lt;Machine:0x10c5afc> ./machine_spec.rb:6: 3) NoMethodError in 'Machine should remember a list of events with transitions' undefined method `events=' for #<Machine:0x10c4a58> ./machine_spec.rb:6: Finished in 0.006597 seconds 3 examples, 3 failures</pre> </td> </tr> </tbody> </table> <br /> <p>鐢變簬鏂扮殑嫻嬭瘯浠g爜浣嶄簬 <code>before</code> 涓紝灝嗘垜鐨勪笁涓祴璇曞垎瑙e紑鏉ャ傚敖綆″姝わ紝娓呭崟 16 涓睍紺虹殑嫻嬭瘯闈炲父瀹規(guī)槗淇銆傛垜灝嗘坊鍔犲彟涓涓闂▼搴忥細(xì)</p> <br /> <a name="listing16"><strong>娓呭崟 16. 璁板繂浜嬩歡</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">class Machine attr_accessor :states, :events attr_reader :state def initialize(states) @states = states @state = @states[0] end end ~/rspec batate$ spec machine_spec.rb ... Finished in 0.00652 seconds 3 examples, 0 failures test</pre> </td> </tr> </tbody> </table> <br /> <p>嫻嬭瘯鍏ㄩ儴閫氳繃銆傛垜寰楀埌浜嗕竴涓兘姝e父榪愯鐨勭姸鎬佹満銆傛帴涓嬫潵鐨勫嚑涓祴璇曞皢浣垮畠鏇村姞瀹屽杽銆?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <br /> <br /> <p><a name="N101FD"><span id="trdjjnp" class="atitle">鎺ヨ繎鐪熷疄鐨勫簲鐢ㄧ▼搴?/span></a></p> <p>鐩墠涓烘錛屾垜鎵鍋氱殑涓嶈繃鏄Е鍙戜簡涓嬈$姸鎬佽漿鎹紝浣嗘槸鎴戝凡緇忓仛濂戒簡鎵鏈夊熀紜宸ヤ綔銆傛垜寰楀埌浜嗕竴緇勯渶姹傘傛垜榪樻瀯寤轟簡涓緇勬祴璇曘傛垜鐨勪唬鐮佸彲浠ヤ負(fù)鐘舵佹満鎻愪緵浣跨敤鐨勬暟鎹傛鏃訛紝綆$悊鍗曚釜鐘舵佹満杞崲浠呰〃紺轟竴嬈$畝鍗曠殑杞崲錛屽洜姝ゆ垜灝嗘坊鍔犲娓呭崟 17 鎵紺虹殑嫻嬭瘯錛?/p> <br /> <a name="listing17"><strong>娓呭崟 17. 鏋勫緩鐘舵佹満鐨勭姸鎬佽漿鎹?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">it "should transition to :checking_out upon #trigger(:checkout) event " do @machine.trigger(:checkout) @machine.state.should == :checking_out end ~/rspec batate$ spec machine_spec.rb ...F 1) NoMethodError in 'Machine should transition to :checking_out upon #trigger(:checkout) event ' undefined method `trigger' for #<Machine:0x10c4d00> ./machine_spec.rb:24: Finished in 0.006153 seconds 4 examples, 1 failure</pre> </td> </tr> </tbody> </table> <br /> <p>鎴戦渶瑕佹姷鍒跺揩閫熸瀯寤哄ぇ閲忓姛鑳界殑璇辨儜銆傛垜搴旇鍙紪鍐欏皯閲忎唬鐮侊紝鍙浣挎祴璇曢氳繃鍗沖彲銆傛竻鍗?18 灞曠ず鐨勮凱浠e皢琛ㄧず API 鍜岄渶姹傘傝繖灝辮凍澶熶簡錛?/p> <br /> <a name="listing18"><strong>娓呭崟 18. 瀹氫箟 trigger 鏂規(guī)硶</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">def trigger(event) @state = :checking_out end ~/rspec batate$ spec machine_spec.rb .... Finished in 0.005959 seconds 4 examples, 0 failures</pre> </td> </tr> </tbody> </table> <br /> <p>榪欓噷鍑虹幇浜嗕竴涓湁瓚g殑杈規(guī)敞銆傚湪緙栧啓浠g爜鏃訛紝鎴戜袱嬈¢兘寮勯敊浜嗚繖涓畝鍗曠殑鏂規(guī)硶銆傜涓嬈℃垜榪斿洖浜?<code>:checkout</code>錛涚浜屾鎴戝皢鐘舵佽緗負(fù) <code>:checkout</code> 鑰屼笉鏄?<code>:checking_out</code>銆傚湪嫻嬭瘯涓嬌鐢ㄨ緝?yōu)畯鐨勬楠ゅ彲浠ヤ负鎴戣妭鐪佸ぇ閲忔棄櫁村Q屽洜涓烘祴璇曠敤渚嬩負(fù)鎴戞崟鑾風(fēng)殑榪欎簺閿欒鍦ㄥ皢鏉ョ殑寮鍙戜腑寰堥毦鎹曡幏鍒般傛湰鏂囩殑鏈鍚庝竴涓楠ゆ槸瀹為檯鎵ц涓嬈$姸鎬佹満杞崲銆傚湪絎竴涓ず渚嬩腑錛屾垜騫朵笉鍏沖績瀹為檯鐨勬満鍣ㄧ姸鎬佹槸浠涔堟牱瀛愮殑銆傛垜浠呬粎鏄牴鎹簨浠惰繘琛岀洸鐩漿鎹紝鑰屼笉鑰冭檻鐘舵併?/p> <p>涓よ妭鐐圭殑鐘舵佹満鏃犳硶鎵ц榪欎釜鎿嶄綔錛屾垜闇瑕佸湪絎笁涓妭鐐逛腑鏋勫緩銆傛垜娌℃湁浣跨敤宸叉湁鐨?<code>before</code> 鏂規(guī)硶錛屽彧鏄湪鏂扮姸鎬佷腑娣誨姞鍙﹀鐨勭姸鎬併傛垜灝嗗湪嫻嬭瘯鐢ㄤ緥涓繘琛屼袱嬈¤漿鎹紝浠ョ‘淇濈姸鎬佹満鑳藉姝g‘鍦版墽琛岃漿鎹紝濡傛竻鍗?19 鎵紺猴細(xì)</p> <br /> <a name="listing19"><strong>娓呭崟 19. 瀹炵幇絎竴嬈¤漿鎹?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">it "should transition to :success upon #trigger(:accept_card)" do @machine.events = { :checkout => {:from => :shopping, :to => :checking_out}, :accept_card => {:from => :checking_out, :to => :success} } @machine.trigger(:checkout) @machine.state.should == :checking_out @machine.trigger(:accept_card) @machine.state.should == :success end ~/rspec batate$ spec machine_spec.rb ....F 1) 'Machine should transition to :success upon #trigger(:accept_card)' FAILED expected :success, got :checking_out (using ==) ./machine_spec.rb:37: Finished in 0.007564 seconds 5 examples, 1 failure</pre> </td> </tr> </tbody> </table> <br /> <p>榪欎釜嫻嬭瘯灝嗕嬌鐢?<code>:checkout</code> 鍜?<code>:accept_card</code> 浜嬩歡寤虹珛鏂扮殑鐘舵佹満銆傚湪澶勭悊絳懼嚭鏃訛紝鎴戦夋嫨浣跨敤涓や釜浜嬩歡鑰屼笉鏄竴涓紝榪欐牱鍙互闃叉鍙戠敓鍙屽懡浠ゃ傜鍑轟唬鐮佸彲浠ョ‘淇濈姸鎬佹満鍦ㄧ鍑轟箣鍓嶅浜?<code>shopping</code> 鐘舵併傜涓嬈$鍑洪鍏堝皢鐘舵佹満浠?<code>shopping</code> 杞崲涓?<code>checking_out</code>銆傛祴璇曠敤渚嬮氳繃瑙﹀彂 <code>checkout</code> 鍜?<code>accept_card</code> 浜嬩歡瀹炵幇涓や釜杞崲錛屽茍鍦ㄨ皟鐢ㄤ簨浠朵箣鍚庢楠屼簨浠剁姸鎬佹槸鍚︽紜備笌棰勬湡涓鏍鳳紝嫻嬭瘯鐢ㄤ緥澶辮觸 鈥?鎴戝茍娌℃湁緙栧啓澶勭悊澶氫釜杞崲鐨勮Е鍙戝櫒鏂規(guī)硶銆備唬鐮佷慨姝e寘鍚竴琛岄潪甯擱噸瑕佺殑浠g爜銆傛竻鍗?20 灞曠ず浜嗙姸鎬佹満鐨勬牳蹇冿細(xì) </p> <br /> <a name="listing20"><strong>娓呭崟 20. 鐘舵佹満鐨勬牳蹇?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">def trigger(event) @state = events[event][:to] end ~/rspec batate$ spec machine_spec.rb ..... Finished in 0.006511 seconds 5 examples, 0 failures</pre> </td> </tr> </tbody> </table> <br /> <p>嫻嬭瘯鍙互榪愯銆傝繖浜涚矖緋欑殑浠g爜絎竴嬈℃紨鍙樹負(fù)鐪熸鍙互縐頒箣涓虹姸鎬佹満鐨勪笢瑗褲備絾鏄繖榪樿繙榪滀笉澶熴傜洰鍓嶏紝鐘舵佹満緙轟箯涓ュ瘑鎬с備笉綆$姸鎬佸浣曪紝鐘舵佹満閮戒細(xì)瑙﹀彂浜嬩歡銆備緥濡傦紝褰撳浜?<code>shopping</code> 鐘舵佹椂錛岃Е鍙?<code>:accept_card</code> 騫朵笉浼?xì)铦{鎹負(fù) <code>:success</code> 鐘舵併傛?zhèn)ㄥ彧鑳藉浠?<code>:checking_out</code> 鐘舵佽Е鍙?<code>:accept_card</code>銆傚湪緙栫▼鏈涓紝<code>trigger</code> 鏂規(guī)硶鐨勮寖鍥村簲閽堝浜嬩歡銆傛垜灝嗙紪鍐欎竴涓祴璇曟潵瑙e喅闂錛岀劧鍚庝慨澶?bug銆傛垜灝嗙紪鍐欎竴涓礋嫻嬭瘯錛坣egative test錛夛紝鍗蟲柇璦涓涓笉搴旇鍑虹幇鐨勮涓猴紝濡傛竻鍗?21 鎵紺猴細(xì)</p> <br /> <a name="listing21"><strong>娓呭崟 21: 璐熸祴璇?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">it "should not transition from :shopping to :success upon :accept_card" do @machine.events = { :checkout => {:from => :shopping, :to => :checking_out}, :accept_card => {:from => :checking_out, :to => :success} } @machine.trigger(:accept_card) @machine.state.should_not == :success end rspec batate$ spec machine_spec.rb .....F 1) 'Machine should not transition from :shopping to :success upon :accept_card' FAILED expected not == :success, got :success ./machine_spec.rb:47: Finished in 0.006582 seconds 6 examples, 1 failure</pre> </td> </tr> </tbody> </table> <br /> <p>鐜板湪鍙互鍐嶆榪愯嫻嬭瘯錛屽叾涓竴涓祴璇曞棰勬湡涓鏍瘋繍琛屽け璐ャ備慨澶嶄唬鐮佸悓鏍峰彧鏈変竴琛岋紝濡傛竻鍗?22 鎵紺猴細(xì)</p> <br /> <a name="listing22"><strong>娓呭崟 22. 淇 trigger 涓殑鑼冨洿闂 </strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">def trigger(event) @state = events[event][:to] if state == events[event][:from] end rspec batate$ spec machine_spec.rb ...... Finished in 0.006873 seconds 6 examples, 0 failures</pre> </td> </tr> </tbody> </table> <br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <br /> <br /> <p><a name="N1029C"><span id="tfjvpxx" class="atitle">緇勫悎浠g爜</span></a></p> <p>鐜板湪錛屾垜鍏鋒湁涓涓彲綆鍗曡繍琛岀殑鐘舵佹満銆傛棤璁轟粠鍝柟闈㈡潵璇達(dá)紝瀹冮兘涓嶆槸涓涓畬緹庣殑紼嬪簭銆傚畠榪樺叿鏈変笅闈㈣繖浜涢棶棰橈細(xì)</p> <ul> <li>鐘舵佹暎鍒楀疄闄呬笂涓嶅叿澶囦換浣曞姛鑳姐傛垜搴旇鏍規(guī)嵁鐘舵佸浜嬩歡鍙?qiáng)鍏惰浆鎹q涜楠岃瘉錛屾垨鑰呭皢鎵鏈夌姸鎬侀泦涓搗鏉ャ傚悗緇渶姹傚緢鍙兘浼?xì)瑕佹眰杩欐牱鍋氥? <li>鏌愪釜鏃㈠畾浜嬩歡鍙兘瀛樺湪浜庝竴涓姸鎬佷腑銆傝繖縐嶉檺鍒跺茍涓嶅悎鐞嗐備緥濡傦紝<code>submit</code> 鍜?<code>cancel</code> 浜嬩歡鍙兘闇瑕佸浜庡涓姸鎬併? <li>浠g爜騫朵笉鍏峰鏄庢樉鐨勯潰鍚戝璞$壒寰併備負(fù)浣塊厤緗繚鎸佺畝鍗曪紝鎴戝皢澶ч噺鏁版嵁緗叆鏁e垪涓傚悗緇殑榪唬浼?xì)杩涗竴姝ラ┍鍔ㄨ璁★紝浣垮叾鏈濋潰鍚戝璞¤璁℃柟鍚戝彂灞曘?</li> </ul> <p>浣嗘槸錛屾?zhèn)q樺彲浠ョ湅鍒幫紝榪欎釜鐘舵佹満宸茬粡鑳藉婊¤凍涓浜涢渶姹備簡銆傛垜榪樺叿澶囦竴涓弿榪扮郴緇熻涓虹殑鏂囨。錛岃繖鏄繘琛屼竴緋誨垪嫻嬭瘯鐨勫ソ璧風(fēng)偣銆傛瘡涓祴璇曠敤渚嬮兘鏀寔緋葷粺鐨勪竴涓熀鏈渶姹傘備簨瀹炰笂錛岄氳繃榪愯 <code>spec machine_spec.rb --format specdoc</code>錛屾?zhèn)ㄥ彲浠ユ煡鐪嬬斵q郴緇熻鑼冪粍鎴愮殑鍩烘湰鎶ュ憡錛屽娓呭崟 23 鎵紺猴細(xì)</p> <br /> <a name="listing23"><strong>娓呭崟 23. 鏌ョ湅瑙勮寖</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">spec machine_spec.rb --format specdoc Machine - should initially have a state of the first state - should remember a list of valid states - should remember a list of events with transitions - should transition to :checking_out upon #trigger(:checkout) event - should transition to :success upon #trigger(:accept_card) - should not transition from :shopping to :success upon :accept_card Finished in 0.006868 seconds</pre> </td> </tr> </tbody> </table> <br /> <p>嫻嬭瘯椹卞姩鏂規(guī)硶騫朵笉閫傚悎鎵鏈変漢錛屼絾鏄秺鏉ヨ秺澶氱殑浜哄紑濮嬩嬌鐢ㄨ繖縐嶆妧鏈紝浣跨敤瀹冩瀯寤哄叿鏈夌伒媧繪у拰閫傚簲鎬х殑楂樿川閲忎唬鐮侊紝騫朵笖鏍規(guī)嵁嫻嬭瘯浠庡ご鏋勫緩浠g爜銆傚綋鐒訛紝鎮(zhèn)ㄤ篃鍙互閫氳繃鍏朵粬妗嗘灦錛堝 test_unit錛夎幏寰楃浉鍚岀殑浼樼偣銆俁Spec 榪樻彁渚涗簡浼樼鐨勫疄鐜版柟娉曘傝繖縐嶆柊嫻嬭瘯妗嗘灦鐨勪竴澶т寒鐐瑰氨鏄唬鐮佺殑琛ㄧず銆傛柊鎵嬪挨鍏跺彲浠ヤ粠榪欑琛屼負(fù)椹卞姩鐨勬祴璇曟柟娉曚腑鍙楃泭銆傝灝濊瘯浣跨敤璇ユ鏋跺茍鍛婅瘔鎴戞?zhèn)ㄧ殑鎰熷彈銆?/p> <img src ="http://www.tkk7.com/lzj520/aggbug/155374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lzj520/" target="_blank">lzj520</a> 2007-10-23 19:01 <a href="http://www.tkk7.com/lzj520/archive/2007/10/23/155374.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> 主站蜘蛛池模板: <a href="http://www55xx.com" target="_blank">精品久久久久久久久免费影院</a>| <a href="http://yuntuzy.com" target="_blank">中文字幕乱码一区二区免费</a>| <a href="http://jiajuco.com" target="_blank">亚洲youwu永久无码精品 </a>| <a href="http://njbyz.com" target="_blank">麻豆亚洲AV永久无码精品久久</a>| <a href="http://abab14.com" target="_blank">免费a级毛片永久免费</a>| <a href="http://fz166.com" target="_blank">亚洲高清视频一视频二视频三</a>| <a href="http://class3g.com" target="_blank">在线a毛片免费视频观看</a>| <a href="http://qqc46.com" target="_blank">麻豆最新国产剧情AV原创免费</a>| <a href="http://770144.com" target="_blank">暖暖在线视频免费视频</a>| <a href="http://roocos.com" target="_blank">国内一级一级毛片a免费</a>| <a href="http://gujingyuye.com" target="_blank">国产精品亚洲美女久久久</a>| <a href="http://chibifilm.com" target="_blank">久久精品国产亚洲av影院</a>| <a href="http://3t77.com" target="_blank">亚洲一区中文字幕久久</a>| <a href="http://clzqb2b.com" target="_blank">99久久亚洲综合精品成人网</a>| <a href="http://91packing.com" target="_blank">亚洲AV成人一区二区三区观看 </a>| <a href="http://t66ycom.com" target="_blank">亚洲午夜在线一区</a>| <a href="http://yuase.com" target="_blank">羞羞网站免费观看</a>| <a href="http://binz132.com" target="_blank">84pao强力永久免费高清 </a>| <a href="http://www779rr.com" target="_blank">亚洲精品国产第一综合99久久</a>| <a href="http://juguanghr.com" target="_blank">亚洲成_人网站图片</a>| <a href="http://28896543.com" target="_blank">亚洲中文字幕无码久久2020</a>| <a href="http://caoliusq1024.com" target="_blank">精品一区二区三区免费视频</a>| <a href="http://dslygc.com" target="_blank">啦啦啦中文在线观看电视剧免费版 </a>| <a href="http://16lds.com" target="_blank">国产亚洲精品2021自在线</a>| <a href="http://ruidamo.com" target="_blank">污视频在线免费观看</a>| <a href="http://127ht.com" target="_blank">vvvv99日韩精品亚洲</a>| <a href="http://770144.com" target="_blank">久久精品国产亚洲AV忘忧草18</a>| <a href="http://3baimm.com" target="_blank">亚洲熟女www一区二区三区</a>| <a href="http://ahsuibao.com" target="_blank">日韩电影免费在线观看中文字幕</a>| <a href="http://tjbdyx.com" target="_blank">一区二区三区四区免费视频 </a>| <a href="http://czshenyue.com" target="_blank">国产一区二区免费在线</a>| <a href="http://532342.com" target="_blank">亚洲黄色在线观看网站</a>| <a href="http://see13.com" target="_blank">久久久久se色偷偷亚洲精品av</a>| <a href="http://8b22.com" target="_blank">亚洲精品无播放器在线播放</a>| <a href="http://ydxcsh.com" target="_blank">日韩精品内射视频免费观看</a>| <a href="http://cangtuyuan.com" target="_blank">亚洲国产专区一区</a>| <a href="http://440878.com" target="_blank">亚洲国产综合AV在线观看</a>| <a href="http://qvod-player.com" target="_blank">成人免费观看男女羞羞视频</a>| <a href="http://xyjxnhcl.com" target="_blank">黄色网站软件app在线观看免费</a>| <a href="http://xzdlgp.com" target="_blank">50岁老女人的毛片免费观看</a>| <a href="http://laosanqq.com" target="_blank">在线精品免费视频无码的</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>