ãã¹ãã¯ããã¹ã¯ãããã³ã³ãã¥ãŒã¿ãã¢ãã€ã«ããã€ã¹ããŸãã¯Webã®ã¢ããªã±ãŒã·ã§ã³ã§ãããã©ããã«ãããããããœãããŠã§ã¢éçºã®äžå¯æ¬ ãªéšåã«ãªããŸããã ãã§ã«ãã®æ®µéã®éèŠæ§ãšããã®æ®µéã®äžåšãããããçµæã誰ãåŠå®ããŠããŸããã ãã®äžã§ããåèŠçŽ ïŒããŒãžïŒããã§ãã¯ããã®ã«å€ãã®æéãè²»ããã補åã®åäœã«äºæãã¬é©ãããããããããã°ã©ã ãä¿®æ£ããã³ã¹ããå¢å ããŸããã ãã¹ããèšè¿°ããååã¯éåžžã«åçŽã§ã-ãé»è²ãããèµ€ãããç·ãããªãã¡ã¯ã¿ãªã³ã°ã é»è²ã¯ä¿çäžã®ãã¹ããèµ€ã¯å€±æãããã¹ããç·ã¯æ£åžžã«æ©èœããŠããã·ã¹ãã ã§ãã
ããã°ã©ãã³ã°ã®çš®é¡ããšã«ãå€ãã®çš®é¡ã®ãã¹ãããããŸãã ããããã©ãã«ã§ãããå
±éç¹ããããŸãã ç§ã®äž»ãªä»äºã¯RORã§Webã¢ããªã±ãŒã·ã§ã³ãäœæããããšãªã®ã§ããããã®ã¢ããªã±ãŒã·ã§ã³ããã¹ãããæ©èœã«ã€ããŠè©±ããŸãããã
ç°å¢èšå®
å€ãã®ãã¹ãç°å¢ïŒTest UnitãRspecãCucumberãªã©ïŒãèŠã€ããããšãã§ããŸãããç§ã¯å人çã«ç©æ¥µçã«Rspecã䜿çšããŠããŸãã ããã«ããããã¹ãã®å€èŠ³ãçŸããããããšãã§ããŸãããåæã«ã³ãŒãã®å€èŠ³ãç¶æããããšãã§ããŸãã gemfileã«ãæ°ããã°ã«ãŒããè¿œå ããŸãã
group :development, :test do
gem "rspec-rails", ">= 2.5"
end
ããªãéçºã¢ãŒãã«rspecãè¿œå ããã®ãïŒããšé©ããããããŸãããããã¹ãŠãéåžžã«åçŽã§ããrspecã¯ãã¢ãã«ãã³ã³ãããŒã©ãŒãscaffoldãçæãããšãã«é©åãªä»æ§ãè¿œå ããŸãã gemãã€ã³ã¹ããŒã«ããããæåŸã®ã€ã³ã¹ããŒã«ã³ãã³ããå®è¡ããŸãããã
rails g rspec:install
ããã§ãrake rspecã³ãã³ãã䜿çšããŠãã¹ããå®è¡ã§ããŸãã ãã®ã¢ãããŒãã®ãã€ãã¹é¢ã¯ããããžã§ã¯ãã®ããããªå€æŽã§ãããã®ã³ãã³ããäœåºŠãå®è¡ããå¿
èŠãããã絶察ã«ãã¹ãŠã®ãã¹ããå®è¡ãããããšã§ãã ãããã£ãŠã代ããã«å¿
èŠãªã³ãã³ããå®è¡ããã«ã¯ããŠã©ããã£ãŒãèŠã€ããå¿
èŠããããŸãã çŸæç¹ã§ã¯ãèªåãã¹ããšã¬ãŒããšãã2ã€ã®åªãããœãªã¥ãŒã·ã§ã³ã«ã€ããŠç¥ã£ãŠããŸãã Autotestã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ããã¬ãŒã«ã«å°éããŸããã ããããæè¿ãç§ã¯ã¬ãŒãã®åœ¢ã§çŽ æµãªãœãªã¥ãŒã·ã§ã³ã«äŒããŸããã ã¬ãŒãèªäœã«ã¯å¿
èŠãªæ©èœã¯ãããŸããããã¢ããªã³ã§äœ¿çšãããšãéåžžã«è±ªè¯ãªãã®ã«ãªããŸãã èŠåå¡ã¯ãããã®è¿œå ã®çŽ2ããŒã¹ãæã£ãŠããŸãããããŠã圌ãã¯å·šå€§ãªæ©äŒãéã³ãŸãã ãã ãã1ã€ã ã説æããŸããguard-rspecã§ãã å¿
èŠãªãã¡ã€ã«ãã€ã³ã¹ããŒã«ããŸãã
group :test do
gem 'guard-rspec'
end
åæåã³ãã³ããå®è¡ããŸãã
guard init .
guard init rspec
1ã€ç®ã¯ã¬ãŒããã¡ã€ã«ïŒãªãã¶ãŒããŒèšå®ãã¡ã€ã«ïŒãäœæãã2ã€ç®ã¯rspecåºæã®ã¢ã¯ã·ã§ã³ãè¿œå ããŸãã ããã§ãguardã³ãã³ãã䜿çšããŠãå¿
èŠãªä»æ§ãäœæããããã«ãã€ã§ãæºåãã§ããŠãããŠã©ããã£ãŒã䜿çšã§ããŸãã ãããããã®ãœãªã¥ãŒã·ã§ã³ã®ãã°ã¯éåžžã«éå±ãªã®ã§ãè²ãè¿œå ããŸãããã ãŸããéç¥ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã ãããŠãããã§æåã®åé¡ã«çŽé¢ããŠããŸã-ããªããšããªãã®ããŒãããŒã¯ç°ãªãOSïŒMac OSãšLinuxïŒãæã£ãŠããŸããã誰ãããã¹ãããå¿
èŠããããŸãã ç§ãã¡ã®è§£æ±ºçã¯æ¬¡ã®è§£æ±ºçã§ããïŒ
gem 'libnotify' , :require => false if RUBY_PLATFORM =~ /linux/i
gem 'rb-inotify', :require => false if RUBY_PLATFORM =~ /linux/i
gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i
次ã«ãrspecã®ãã¹ãŠã®ãã€ã³ããããŒã»ã³ããŒãžèšç®ã§çœ®ãæããŸãã
gem 'fuubar'
æåŸã«ãGuardfileã«ä»¥äžãèšè¿°ããŸãã
guard 'rspec', :cli =>'--format Fuubar --color'
ãã¹ããå®è¡ããŸãã ã³ã³ãœãŒã«ã«çŸããããã°ã¬ã¹ããŒã衚瀺ããããã¹ããå®äºãããšããããã¢ãããŠã£ã³ããŠã衚瀺ãããŸãã
ãã¹ãç°å¢ãã»ããã¢ããããããã®æ¬¡ã®ã¹ãããã¯ããã¹ãã«çŽåºŠãäžããããšã§ãã çµå±ã®ãšããããã¹ããå®è¡ãããšãã«ä»¥åã®ãã§ãã¯ã§ããŒã¿ããŒã¹ã®å€ãã¬ã³ãŒãã«åºãããããšãæãã§ããŸããã ãã®å Žåã®é©åãªéžæã¯ãgem database_cleanerã§ãã ãã®æ§æã以äžã«ç€ºããŸãã
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
ã¯ãªãŒããŒãã»ããã¢ããããåŸããã¹ãå¯èœãªã³ã³ãã³ãã®äœæã«ã€ããŠè©±ãã®ã¯è¯ãããšã§ãã Rspecã¯ã¢ãã¯ã®äœ¿çšãæšå¥šããŠããŸãããå人çã«ã¯ãå®éã®ãªããžã§ã¯ããçæããããšã奜ã¿ãŸãã machinistãŸãã¯factory_girlã䜿çšããŠãããŸããŸãªãªããžã§ã¯ããäœæã§ããŸãã ç§ã¯æ©æ¢°å·¥ã«ç¹ã«è©³ãããªãã®ã§ã圌ã«ã€ããŠã¯äœãèšããŸããã ããããç§ã¯é·ãéfactory_girlãšä»äºãããŠãããgemã¯èŠæ
ãç³ãç«ãŠãããšã¯ãããŸããã å®ç³ããã¹ãã°ã«ãŒãã«è¿œå ããŸãã
group :test do
gem 'guard_rspec'
gem 'factory_girl_rails'
gem 'database_cleaner'
end
ãªã³ã¯ã®ãã®èšäºä»¥å€ã§æ€èšããããšãææ¡ããæ®ãã®äœ¿çš
ãã¹ãèªäœ
åºæ¬çãªãã¹ãç°å¢ã確ç«ãããããã®æ©èœã«ã€ããŠèª¬æã§ããŸãã Rspecã¯ãã¹ãŠã®ãã¹ããéšåçã«åå²ããŸããã€ãŸããappã»ã¯ã·ã§ã³ã®ãã©ã«ããŒã®ã³ããŒãspecãã©ã«ããŒã«äœæãããŸãã æ§ãããªéçºããã³ãã¹ãæéäžãã¢ãã«ããã«ããŒãã¡ãŒã©ãŒã»ã¯ã·ã§ã³ã®ã¿ãæçšã§ããããšãããããŸããã ãããŠããã³ã³ãããŒã©ãŒãšãã¥ãŒã®æãéèŠãªã³ã³ããŒãã³ããã©ããããããšããçåãçããŸããç§ã®æèŠã§ã¯ãrspecãæäŸãããœãªã¥ãŒã·ã§ã³ã¯å®å
šã§ã¯ãªãããŸã£ããçŸå®çã§ã¯ãããŸããã ãããã£ãŠãéçºã®ããã«ãèŠæ±ããã¹ãããå¿çãåãåããŸããã ãããè¡ãã«ã¯ãcapybaraãã€ã³ã¹ããŒã«ããŸãã ã©ã€ãã©ãªã®äœæè
ïŒJonas NicklasïŒã¯æ¬¡ã®ããã«èª¬æããŠããŸãã
ãCapybaraã¯ãRailsãSinatraãMerbãªã©ã®Rackã¢ããªã±ãŒã·ã§ã³ã®çµ±åãã¹ãã®ããã»ã¹ãç°¡çŽ åããããšãç®æããŠããŸãã ã«ããã©ã¯ãå®éã®ãŠãŒã¶ãŒãWebã¢ããªã±ãŒã·ã§ã³ãšå¯Ÿè©±ããããšãã·ãã¥ã¬ãŒãããŸãã
æåéã次ã®ããã«èãããŸãïŒ
ãã«ããã©
ã¢ã«ã¢ããã¯ãã¢ããªã±ãŒã·ã§ã³ã§ã®ãŠãŒã¶ãŒã®è¡åãã·ãã¥ã¬ãŒãããããšã«ãããå
æ¬çãªãã¹ãããã»ã¹ãç°¡çŽ åããŸããã
gemfileã«è¿œå ããŸãã ãã®åŸããã¡ã€ã«spec / test_helper.rbã«Capybaraã©ã€ãã©ãªãè¿œå ããå¿
èŠããããŸãã
require 'capybara/rspec'
çŸåšãç§ãã¡ã®ãã¹ãã¯ãå€ãã®æ©èœçã§äŸ¿å©ãªãã¹ãæ¹æ³ãšä»®æ³ããŒãžã®æäœã§æºããããŠããŸãã é çªã«å§ããŸãããïŒ
ããŒãžãžã®èšªåã¯ã蚪å蚪åã¡ãœããã䜿çšããŠè¡ãããŸãã
visit '/'
å°æåã®ã¢ãã¬ã¹ã«å ããŠããã®ã¡ãœããã¯Railsãã¹ãã«ããŒãåãå
¥ããŸãã
visit car_wheels_path(car)
ãã ããã©ã€ãã©ãªã®äž»ãªæ©èœã¯ãã¢ã¯ã»ã¹å¯èœãªããŒãžãªããžã§ã¯ãã§ãã ãã®ãªããžã§ã¯ãã¯ããã¹ãçšã®ä»®æ³ããŒãžã§ãã ãã®å
容ãååŸããã«ã¯ãbodyã¡ãœããã䜿çšããã ãã§ãã
puts page.body
æäœã³ãã³ãã®ãªã¹ããèŠãŠã¿ãŸãããã ããã¹ããšãã¹ã¯ãŒãã®ãã£ãŒã«ãã¯fill_inã¡ãœããã§åããããŸãããã®ã¡ãœããã¯idãclassãnameèŠçŽ ãæã€æåã®ãã©ã¡ãŒã¿ãŒãåãåããwithãã©ã¡ãŒã¿ãŒã§ã³ã³ãã³ããèšå®ããŸãã
fill_in 'car_manufacture', :with=>'Audi'
fill_in 'car[model]', :with=>'A4'
selectã§ãªãã·ã§ã³ãéžæããã«ã¯ãselectã¡ãœããã䜿çšãããŸãïŒããããšããKepïŒãæåã«å€ãåãåãã次ã«æäœçšã®èŠçŽ ãåãåããŸãã
ãã·ã«ããŒããéžæããŸãïŒfrom => 'car [color]'
ãã§ãã¯ããã§ãã¯è§£é€ãéžæã®ã¡ãœãããããããã®ç®çã¯ãã§ãã¯ããã¯ã¹ãšã©ãžãªãã¿ã³ã®ç¶æ
ãå€æŽããããšã§ãã èŠçŽ ã®èå¥åã®ã¿ãåãå
¥ããŸãïŒ
check 'car[full_package]'
choose 'car[year][2010]'
ããããããŒãžã«åãååã®èŠçŽ ãããã€ãããããŸãã¯idãååšããããšããããŸãã ãããè¡ãã«ã¯ãæå®ããèŠçŽ å
ã®æ€çŽ¢ãå¶éãããããã¯å
ã¡ãœããããããŸãã
within 'form#payment_card' do
#
end
ãã¿ã³ãšãªã³ã¯ãã¯ãªãã¯ããæ¹æ³ã¯ããã€ããããŸã-ãŠãããŒãµã«ïŒclick_onïŒãšç¹å®ïŒclick_linkãclick_buttonïŒïŒ
click_on 'submit_form'
click_link 'read_more'
次ã«ãçµæã®æ§é ã®ç¢ºèªã«ç§»ããŸãããã DOMèŠçŽ ã®ååšã確èªããããã«ãhave_selectorã¡ãœãããååšããŸãã
page.should have_selector('table tr')
ãããããããã®èŠçŽ ã®æ°ã確èªããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ ããã¯ååç°¡åã§ã-countãã©ã¡ãŒã¿ãŒãè¿œå ããŠãã ããïŒ
page.should have_selector('table tr', :count=>3)
èŠçŽ èªäœãfazhnã§ã¯ãªããã³ã³ãã³ãã®ã¿ãéèŠãªç¶æ³ã§ã¯ãpage.have_contentã¡ãœããã䟿å©ã§ããïŒ
page.should have_content(âAudi clubâ)
ããããjsã¯ã©ãã§ããïŒ
ããã€ãã®ä»æ§ãæžããã®ã§ãããªãã¯ãã§ã«capybaraãjsã¹ã¯ãªãããå®å
šã«ç¡èŠããŠããããšã«æ°ä»ããŸããã éçºè
ã¯ããã¹ãã«åæ Œãããšãã«ããã©ãŒãã³ã¹ãç¶æãããããããã®æé ãå®è¡ããŸããã ãã¹ãŠã®æ©èœãåããããŒãžã確èªããå¿
èŠãããå Žåã¯ãjs specãã©ã¡ãŒã¿ãŒã䜿çšããŸãã
it 'should have many js', :js=>true do
visit âŠ
end
ãæ°ã«å
¥ãã®ãã©ãŠã¶ã®ãŠã£ã³ããŠã衚瀺ããããã¹ãæžã¿ã®ããŒãžãéããã«ãŒãœã«ããã¹ãŠã®åããããŸãã ãã éæ³ã§ããããããç解ããŸãããã å®éãã«ããã©ã¯ãã¹ãããŒãžãåŠçããããã«Webãã©ã€ããŒãåãæ¿ããŸããã ããã©ã«ãã§ã¯ãå¿çã§åä¿¡ããã³ã³ãã³ãã§ã®ã¿åäœããã©ãã¯ãã©ã€ããŒã䜿çšãããŸãã jsãã©ã¡ãŒã¿ãŒã䜿çšãããšãcapybaraã¯ã»ã¬ã³ãã©ã€ããŒãžã®ã¢ã¯ã»ã¹ãéå§ããŸãã Seleniumã¯ãç¹ã«æå®ãããŠããªãéããã·ã¹ãã ãã©ãŠã¶ãŒãèµ·åããå¿
èŠãªãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ããã€ãã®ç¹ãé€ããŠããã¹ãŠãçŸããçŸãããªã£ãŠããŸãã ãŸãããã¹ãã®å®è¡æéãéåžžã«é·ããªããŸãã ãããŠãé©ãããšã§ã¯ãããŸããããã¬ãŒã«ç°å¢èªäœãããŒãããããšã«å ããŠããã¹ãã¯ãã©ãŠã¶ãŒãèµ·åããããã«æäœã«ãæéãããããŸãã 第äºã«ããã©ãŠã¶ãåžžã«è¡šç€ºãããããšã«äžæºã§ããã ãããã£ãŠã代ããã®Webãã©ã€ããŒã§ããcapybara-webkitãåªå
ããŠãã»ã¬ã³ãæŸæ£ããå¿
èŠããããŸããã ãã®gemã¯ããããã®åé¡ã解決ããããã«ç¹å¥ã«äœæãããŸããã ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããã«ã¯ãcapybara-webkitèªäœã«å ããŠãå¥ã®qtã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã spec_helperã®åŸãjavascriptã䜿çšããããŒãžã«äœ¿çšãããã©ã€ããŒãæå®ããŸãã
Capybara.javascript_driver :webkit
ããã§ãã«ããã©ã¯çµ±åãã¹ããäžèŠãªã¢ãã¡ãŒã·ã§ã³ãªãã§è¿
éã«å®è¡ããŸãã
ãã1ã€ã®èå³æ·±ãç¹ã¯ãajaxã䜿çšããŠèªã¿èŸŒãŸããèŠçŽ ããã§ãã¯ããããšã§ãã have_selectorã¡ãœãããšhave_contentã¡ãœããã¯åžžã«ãã¹ãããšã¯éããªããããæåã«allãfindããªã©ã®ã¡ãœããã䜿çšããŸãã
first('div.info').should be
all('tr.ads').should have(3).items
ãŸããfindããã³firstã¡ãœããã¯ããã¿ã³ããã³ãªã³ã¯ä»¥å€ã®èŠçŽ ã®ã¯ãªãã¯ããšãã¥ã¬ãŒãããã®ã«åœ¹ç«ã¡ãŸãã
first('div.catalog').click
find('p#info).click
ã¹ã¯ãªãããå®è¡ãããå Žåã¯ãã«ããã©ãããã§åœ¹ç«ã¡ãŸãã
page.execute_javascript âalert('Hello world')â
æåã¯ãããã¯å®å
šãªãã³ã»ã³ã¹ã®ããã«èŠããŸã-ãããããjsãã¹ãã§å®è¡ãããã€ã³ãã¯äœã§ããïŒããããŠçãã¯ãã¯ãªãã¯ããŠéžæãã以å€ã®ã¢ã¯ã·ã§ã³ã«ããŒãžã®åäœããã¬ãŒã¹ããå¿
èŠãããç¶æ³ã§ãïŒ
page.execute_javascript '$(âp.long_textâ).hover();'
ããããã«ãŒãœã«ã®æ®µèœäžã§ã®ãããŒããšãã¥ã¬ãŒãããæ¹æ³ã§ãã
人çããã®ããã€ãã®èŠ³å¯
ãããŠãç§ã®æçš¿ã®æåŸã«ãå人çãªçµéšããã®ããã€ãã®ãã³ãããããŸãã js Webãã©ã€ããŒã§capybaraãdatabase_cleanerãfactory_girlã䜿çšããå ŽåãäœæããããªãœãŒã¹ã¯ãã¹ãããŒãžã«è¡šç€ºãããŸããã ãã®ç¶æ³ãä¿®æ£ããã«ã¯ã次ã®èšå®ïŒ
config.use_transactional_fixtures = false
å¥ã®èå³æ·±ãããªãã¯ã¯ãrspecã«çŠç¹ãåœãŠãããšã§ããèŠæ±ã®å³ãããã¹ãã§ã¯ããã®æå¹æ§ã¯åŠå®ã§ããŸããã ãã©ãŒã«ã¹èª¿æŽã¯æ¬¡ã®ãšããã§ãã ãŸãããã¹ãç°å¢ã®æ§æãã¡ã€ã«ã«æ¬¡ã®è¡ãè¿œå ããŸãã
config.filter_run :focus=>true
config.run_all_when_everything_filtered = true
ãã®åŸãç®çã®ã¢ã¯ã·ã§ã³ãå®è¡ããã«ã¯ãååãã©ã¡ãŒã¿ãŒãè¿œå ããã ãã§ååã§ããfocus=> trueã§ãä»æ§ã®ãªã¹ãããã£ã«ã¿ãŒãããŸãã
䟿å©ãªãªã³ã¯
ã«ããã©ã«ããã©ãŠã§ããããããŒã¿ããŒã¹ã¯ãªãŒããŒå·¥å Žã¬ãŒã«ã¬ãŒã«ã¬ãŒã