Upgrade to Pro — share decks privately, control downloads, hide ads and more …

devlove2012-let-yor-test-drive-dev-more

 devlove2012-let-yor-test-drive-dev-more

MOROHASHI Kyosuke

December 16, 2012
Tweet

More Decks by MOROHASHI Kyosuke

Other Decks in Programming

Transcript

  1. ςετʹ։ൃΛ
    ۦಈ͍ͤͨ͞
    (ג) Ӭ࿨γεςϜϚωδϝϯτ
    ॾڮګհ @moro
    ΋ͬͱ

    View Slide

  2. • MOROHASHI Kyosuke
    • @moro on Twitter and GitHub
    • works at @esminc

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. ͖ΐ͏࿩͢͜ͱ
    •ςετΛॻ͜͏ͱͯ͠ɺ͔͑ͬͯ։
    ൃ͕ਏ͘ײͨ͜͡ͱɺ͋Γ·ͤΜ?
    •ςετΛ͍͍ಋ͖໾ʹ͢ΔݟํΛ঺
    հ͠·͢

    View Slide

  7. Ͳ͏ͯ͠ςετΛॻ͘ͷ
    •ͦΕ͕ਖ਼͍͠΍Γํ͔ͩΒ
    •඼࣭͕޲্͢Δ͔Β
    •σάϨ࣌ʹ͙͢ؾ͚ͮΔ͔Β

    View Slide

  8. ͡Ό͋ςετΛॻ͘ͷ͸ɺ
    কདྷͷͨΊʹߴ͍อݥྉΛ
    ෷͏Α͏ͳ΋ͷͳͷ

    View Slide

  9. http://flic.kr/p/zBdU7
    ςετ͸։ൃΛ
    ۦಈ͢Δ
    ͓࡞๏ͱ͔ɺ
    ਖ਼͍͔͠Ͳ͏͔ͱ͔͚ͩͰͳ͘
    ։ൃ͠΍͘͢͢Δ

    View Slide

  10. ίʔυΛॻ͘ͱ͖ʹ
    ΍͍ͬͯΔ͜ͱ

    View Slide

  11. think
    code
    run
    Programming workflow

    View Slide

  12. think
    code
    run
    ίʔυΛॻ͍ͨΒ
    ಈ͔͍ͨ͠Ͱ͢ΑͶ?

    View Slide

  13. SVO
    •ॻ͍ͨίʔυ͸ɺ࣮ߦͯ͠Έ
    ͳ͍ͱΘ͔Βͳ͍
    •ॻ͍ͨΒ͙͢ʹಈ͔ͨ͘͠ͳ
    Γ·ͤΜ?

    View Slide

  14. ಈ͔͢
    if __FILE__ == $0
    require 'pp'
    myobj = MyClass.new(:arg)
    p myobj.do_something
    pp myobj
    end
    ςετ࢖Θͣʹ࣮ߦ͢Δ

    View Slide

  15. ಈ͔͢
    % irb -r ./my_class
    > my_obj = MyClass.new
    > myobj.do_something
    > myobj
    ର࿩࣮ߦ؀ڥ΋͋Δ

    View Slide

  16. w͙͢ʹಈ͔ͤΔ
    wͰ΋΋͏ͪΐͬͱෳࡶ
    ʹͳΔͱ

    View Slide

  17. ಈ͔͢
    if __FILE__ == $0
    require 'pp'
    alice = Person.create(name: 'alice', age: 24)
    alisia = Person.create(name: 'alisia', age: 30)
    bob = Person.create(name: 'bob', age: 18)
    chris = Person.create(name: 'chris', age: 42)
    pp Person.name_like('ali')
    pp Person.younger_than(24)
    end
    ΋͏ͪΐͬͱෳࡶͳྫ

    View Slide

  18. ಈ͔͢
    $ rails console
    > alice = Person.create(name: 'alice')
    > alissa = Person.create(name: 'alissa')
    > bob = Person.create(name: 'bob')
    > chris = Person.create(name: 'chris')
    >
    > Person.name_like('ali')
    > Person.younger_than(24)
    ର࿩࣮ߦ؀ڥͰ΋
    Ͱ͖Δͱ͍͑͹Ͱ͖Δ

    View Slide

  19. ࣮ߦ݁ՌΛ
    ݟΔͨΊʹ
    ඞཁͳ͜ͱ

    View Slide

  20. ಈ͔͢
    if __FILE__ == $0
    require 'pp'
    alice = Person.create(name: 'alice', age: 24)
    alisia = Person.create(name: 'alisia', age: 30)
    bob = Person.create(name: 'bob', age: 18)
    chris = Person.create(name: 'chris', age: 42)
    pp Person.name_like('ali')
    pp Person.younger_than(24)
    end
    σʔλͳͲͷ४උ
    લͷσʔλ͕࢒ͬͯͳ͍͔΋֬ೝ͠ͳ͍ͱΠΧϯ

    View Slide

  21. ಈ͔͢
    if __FILE__ == $0
    require 'pp'
    alice = Person.create(name: 'alice', age: 24)
    alisia = Person.create(name: 'alisia', age: 30)
    bob = Person.create(name: 'bob', age: 18)
    chris = Person.create(name: 'chris', age: 42)
    pp Person.name_like('ali')
    pp Person.younger_than(24)
    end
    ݁ՌΛ໨ࢹ

    View Slide

  22. ಈ͔͢
    if __FILE__ == $0
    require 'pp'
    alice = Person.create(name: 'alice', age: 24)
    alisia = Person.create(name: 'alisia', age: 30)
    bob = Person.create(name: 'bob', age: 18)
    chris = Person.create(name: 'chris', age: 42)
    pp Person.name_like('ali')
    pp Person.younger_than(24)
    end
    ݁Ռ͕࣮ߦॱʹґଘ
    ΠνΠνߟ͑ͳ͍ͱ͍͚ͳ͍

    View Slide

  23. ಈ͔͢
    if __FILE__ == $0
    require 'pp'
    alice = Person.create(name: 'alice', age: 24)
    alisia = Person.create(name: 'alisia', age: 30)
    bob = Person.create(name: 'bob', age: 18)
    chris = Person.create(name: 'chris', age: 42)
    pp Person.name_like('ali')
    pp Person.younger_than(24)
    end
    ݁Ռ͕࣮ߦॱʹґଘ
    σʔλΛมߋͨ͠Γ͢ΔͱπϥΠ
    ༨ܭͩͱࢥͬͨ
    σʔλΛফͨ͠Β
    ผͷςετͰ
    ࢖͓ͬͯͨ...

    View Slide

  24. •σʔλͱ͔Λ४උ͠ͳ͍ͱ!
    •݁ՌΛ໨ࢹ͠ͳ͍ͱ!!
    •࣮ߦॱʹ΋஫ҙ͠ͳ͍ͱ!!!
    ͔͠΋ςετ͕૿͑Ε͹૿͑Δ΄Ͳ
    େมʹͳΔɻ͏΁͐
    ςετ࢖Θͣʹ࣮ߦ͢Δ
    ಈ͔͢

    View Slide

  25. ͦ͜ͰςεςΟϯά
    ϑϨʔϜϫʔΫͰ͢Α
    • Arrange :
    σʔλ΍ίϯςΩετΛ༻ҙ
    • Act :
    ͦΕͧΕಠཱʹɺಈ͔ͯ͠
    • Assert :
    ݁ՌΛࣗಈతʹνΣοΫ͢Δ

    View Slide

  26. ಈ͔͢
    ςετͱ࣮ͯ͠ߦ͢Δ
    describe Person do
    context '4 people with below' do
    let!(:alice) { Person.create(name: 'alice', age: 24) }
    let!(:alissa){ Person.create(name: 'alissa', age: 30) }
    let!(:bob) { Person.create(name: 'bob', age: 18) }
    let!(:chris) { Person.create(name: 'chris', age: 42) }
    describe '.name_like' do
    subject { Person.name_like('ali').map(&:name) }
    it { should =~ %w[alice alissa] }
    end
    describe '.younger_than' do
    subject { Person.younger_than(24).map(&:name) }
    it { should =~ %w[bob] }
    end
    end
    end

    View Slide

  27. Arrange:
    σʔλͳͲΛ
    ମܥͩͬͯ४උ͢Δ

    View Slide

  28. ribe Person do
    ntext '4 people with below' do
    let!(:alice) { Person.create(name: 'alice', age:
    let!(:alissa){ Person.create(name: 'alissa', age:
    let!(:bob) { Person.create(name: 'bob', age: 18
    let!(:chris) { Person.create(name: 'chris', age:
    describe '.name_like' do
    subject { Person.name_like('ali').map(&:name) }
    it { should =~ %w[alice alissa] }
    end
    describe '.younger_than' do
    subject { Person.younger_than(24).map(&:name) }
    it { should =~ %w[bob] }
    end

    View Slide

  29. Act:
    ͦΕͧΕ
    ಠཱʹಈ͔͢

    View Slide

  30. ibe Person do
    text '4 people with below' do
    et!(:alice) { Person.create(name: 'alice', age:
    et!(:alissa){ Person.create(name: 'alissa', age:
    et!(:bob) { Person.create(name: 'bob', age: 18
    et!(:chris) { Person.create(name: 'chris', age:
    escribe '.name_like' do
    subject { Person.name_like('ali').map(&:name) }
    it { should =~ %w[alice alissa] }
    nd
    escribe '.younger_than' do
    subject { Person.younger_than(24).map(&:name) }
    it { should =~ %w[bob] }
    nd

    View Slide

  31. Assert:
    ݁ՌΛ
    ࣗಈతʹݕূ͢Δ

    View Slide

  32. let!(:alissa){ Person.create(name: 'alissa', age
    let!(:bob) { Person.create(name: 'bob', age: 1
    let!(:chris) { Person.create(name: 'chris', age:
    describe '.name_like' do
    subject { Person.name_like('ali').map(&:name)
    it { should =~ %w[alice alissa] }
    end
    describe '.younger_than' do
    subject { Person.younger_than(24).map(&:name)
    it { should =~ %w[bob] }
    end
    d

    View Slide

  33. ςετ͕։ൃΛۦಈ͢ΔϙΠϯτ
    ίʔυͷ࣮ߦΛߏ଄Խ͢Δ
    • ςεςΟϯάϑϨʔϜϫʔΫ͕ɺίʔυ
    ࣮ߦΛॿ͚ͯ͘ΕΔ:
    • ίϯςΩετͷηοτΞοϓ
    • ಠཱ࣮ͯ͠ߦ
    • ݁Ռͷݕূ

    View Slide

  34. ͜
    ͜
    ·
    Ͱ
    ͷ
    ·
    ͱ
    Ί
    ‣ ͪΐͬͱେ͖͍ίʔυΛɺ
    ςετ࢖Θͣʹಈ͔͢ͱେม
    ‣ ςετΛ࢖͏ͱɺॻ͍ͨίʔυ
    Λ͙͢ʹɺ҆৺ͯ͠ಈ͔ͤΔ

    View Slide

  35. ΋͏ͪΐͬͱ೉͍͠
    ໰୊ʹऔΓ૊Ήͱ͖
    Ͳ͏͢Δ?
    http://flic.kr/p/5xKFpY

    View Slide

  36. ͜Μͳ͜ͱΛ
    ߟ͍͑ͯΔ͸ͣ
    •ࣄલ৚݅͸ͲΜͳ͔ͳ?
    •݁Ռ͸Ͳ͏ͳΕ͹͍͍Μͩ?
    •Ͳ͏͍͏࡞Γ͕͍͍ͷ͔ͳ?

    View Slide

  37. think
    code
    run
    Programming workflow

    View Slide

  38. think
    code
    run
    Programming workflow
    ౰ͨΓલ͗ͯ͢Θ͔Βͳ͍͚Ͳ
    ·ͣɺߟ͍͑ͯ·͢ΑͶ?

    View Slide

  39. wͳʹΛ͢Δ͔
    wͲ͏͢Δ͔

    View Slide

  40. View Slide

  41. Ϣʔβͱͯ͠γεςϜʹ
    ʮͳʹΛʯͯ͠ཉ͍͔͠

    View Slide

  42. ։ൃऀͱͯ͠
    ʮͲ͏ʯಈ͔͍͔ͨ͠

    View Slide

  43. ։ൃऀͱͯ͠
    ΦϒδΣΫτʹʮͳʹΛʯͯ͠ཉ͍͔͠

    View Slide

  44. ͍··͞ʹ࣮૷͍ͯ͠Δ։ൃऀͱͯ͠
    ͜ͷΦϒδΣΫτΛʮͲ͏ʯ࡞Δ͔

    View Slide

  45. ͍··͞ʹ࣮૷͍ͯ͠Δ։ൃऀͱͯ͠
    ͜ͷϝιου͸ʮͳʹΛʯ͢Δ͔

    View Slide

  46. ͍··͞ʹ࣮૷͍ͯ͠Δ։ൃऀͱͯ͠
    ͜ͷϝιουΛʮͲ͏ʯ࡞Δ͔

    View Slide

  47. ͳʹΛ͢Δ͔Λ
    ߟ͑ͯ
    ςετʹॻ͘

    View Slide

  48. ͍ΖΜͳࢹ఺ͰʮͳʹΛʯ͢Δ͔

    View Slide

  49. wϢʔβͱͯ͠γεςϜʹʮͳ
    ʹΛʯͯ͠ཉ͍͔͠
    w։ൃऀͱͯ͠ΦϒδΣΫτʹ
    ʮͳʹΛʯͯ͠ཉ͍͔͠

    View Slide

  50. Cucumber
    •ࣗવݴޠ(΋ͪΖΜ೔ຊޠ΋!!)Λ
    ࢖ͬͯʮͳʹΛʯ͢Δ͔Λॻ
    ͚Δςετπʔϧɻ
    •cucumber-jvm͍ͬͯ͏Javaα
    ϙʔτ΋

    View Slide

  51. View Slide

  52. View Slide

  53. 5%%ϑϨʔϜϫʔΫ
    •jUnitͱ͔ɺRSpecͱ͔
    •։ൃऀͱͯ͠ɺΦϒδΣΫτ
    ʹԿΛ͍͔ͤͨ͞Λهड़͢Δ

    View Slide

  54. Ϣʔβc։ൃऀ
    ͱͯ͠
    γεςϜc͜ͷΦϒδΣΫτ
    ʹ
    ʮͳʹΛʯͯ͠ཉ͍͔͠ߟ͑Δ

    View Slide

  55. ͜
    ͜
    ·
    Ͱ
    ͷ
    ·
    ͱ
    Ί
    ‣ ࢲͨͪ͸ߟ͍͑ͯΔ
    ‣ ʮͳʹΛʯ͢Δ͔ͱʮͲ͏ʯ
    ࡞Δ͔Λ෼͚ͯߟ͑Δ
    ‣ ʮͳʹΛʯ͢Δ͔Λςετͱ
    ͯ͠ॻ͘

    View Slide

  56. Α͋͘Δײ͡ͷ
    ݕࡧϑΥʔϜ

    View Slide

  57. wΑ͋͘ΔݕࡧϑΥʔϜ
    w໊લͷ෦෼Ұக
    w೥ྸͰͷൺֱ
    wझຯͰͷݕࡧ
    Person
    - name (str)
    - age (int)
    Hobby
    - name (str)
    Interest
    - person_id(fk)
    - hobby_id(fk)
    1
    *
    *
    1

    View Slide

  58. ߟ͑Δ
    • ActiveRecord ͷscopeΛఆٛ
    ͠·͠ΐ͏
    • (࣮͸΋͏લͷྫͰͰ͖ͯ·ͨ͠ :-) )
    ·ͣ͸؆୯ͳͱ͜Ζ͔Β

    View Slide

  59. describe Person do
    context '4 people with below' do
    let!(:alice) { Person.create(name: 'alice', age: 24)
    let!(:alissa){ Person.create(name: 'alissa', age: 30)
    let!(:bob) { Person.create(name: 'bob', age: 18) }
    let!(:chris) { Person.create(name: 'chris', age: 42)
    describe '.name_like' do
    subject { Person.name_like('ali').map(&:name) }
    it { should =~ %w[alice alissa] }
    end
    describe '.younger_than' do
    subject { Person.younger_than(24).map(&:name) }
    it { should =~ %w[bob] }
    end
    end
    end

    View Slide

  60. class Person < ActiveRecord::Base
    scope :name_like, ->(name) {
    where("#{table_name}.name LIKE ?", "#{name}
    }
    scope :younger_than, ->(age) {
    where("#{table_name}.age < ?", age.to_i)
    }
    end

    View Slide

  61. ߟ͑Δ
    •ྫ͑͹: είʔϓ໊͸...
    `has_at_least_one_hobby'.
    •hobbyΛ഑ྻͰऔΔͱ͍͍͔ͳ?
    `%w[programming BBQ travel]` .
    •ͱɺߟ͑ͨ͜ͱΛςετʹॻ͘
    hobby͸Ͳ͏͠Α͏

    View Slide

  62. ribe Person do
    ntext '4 people with below' do
    # snip
    describe '.has_at_least_one_hobby(hobbies)' do
    let(:hobbies) { %w[programming BBQ travel] }
    subject(:people) do
    Person.has_at_least_one_hobby(hobbies)
    end
    end
    d
    ͏ʔΜɺ໊લ͕௕͗͢ΔɺΑ͏ͳ...

    View Slide

  63. ߟ͑Δ
    • தؒςʔϒϧ'interests'ͬͯͷ͕͋Δ!
    • Ruby ͩͱ `#any?`ϝιου͕͋Δͳɻ
    • ͡Ό͋͜ΜͳͷͰͲ͏͔:
    Person.interest_in_any(ho
    bbies)
    ΋ͬͱྑ໊͍લ͸ͳ͍͔ͳ

    View Slide

  64. describe Person do
    context '4 people with below' do
    # snip
    describe '.interest_in_any(hobbies)' do
    let(:hobbies) { %w[programming BBQ travel
    subject(:people) do
    Person.interest_in_any(hobbies)
    end
    end
    end
    end Αͦ͞͏!

    View Slide

  65. ߟ͑Δ
    • ֬ೝ͢ΔͨΊʹϢʔβ2ਓҎ্΄͍͠
    • ৚݅ʹϚον͢Δਓͱɺ͠ͳ͍ਓͱ
    • ͜͏͍͏ͷΛbefore {} (RSpec)΍
    setup {} (test/unit)ʹॻ͘
    ࣄલ৚݅ͳΜ͚ͩͬ

    View Slide

  66. describe '.interest_in_any(hobbies)' do
    let(:hobbies) { %w[programming BBQ travel] }
    before do
    hobbies.each do |hobby_name|
    Hobby.create!(name: hobby_name)
    end
    Hobby.create!(name: 'baseball')
    alice.hobbies << Hobby.where(name: 'travel').
    bob.hobbies << Hobby.where(name: 'programmi
    chris.hobbies << Hobby.where(name: 'baseball'
    end
    subject(:people) { Person.interest_in_any(hobbi
    end

    View Slide

  67. ߟ͑Δ
    •ͪΌΜͱɺϚον͢Δ͸ͣͷ
    ਓ͚ͩϚονͯ͠ΔΑͶ...?
    ͳʹΛݕূ͢Δ͔

    View Slide

  68. Hobby.create!(name: hobby_name)
    end
    Hobby.create!(name: 'baseball')
    alice.hobbies << Hobby.where(name: 'travel')
    bob.hobbies << Hobby.where(name: 'programm
    chris.hobbies << Hobby.where(name: 'baseball
    end
    subject(:people) { Person.interest_in_any(hobb
    it { should =~ [alice, bob] }
    end

    View Slide

  69. http://flic.kr/p/4rxk3X
    ࠷ॳͷΰʔϧ͕
    ݟ͑ͨ

    View Slide

  70. describe '.interest_in_any(hobbies)' do
    let(:hobbies) { %w[programming BBQ travel] }
    before do
    hobbies.each do |hobby_name|
    Hobby.create!(name: hobby_name)
    end
    Hobby.create!(name: 'baseball')
    alice.hobbies << Hobby.where(name: 'travel').first
    bob.hobbies << Hobby.where(name: 'programming').first
    chris.hobbies << Hobby.where(name: 'baseball').first
    end
    subject(:people) { Person.interest_in_any(hobbies) }
    it { should =~ [alice, bob] }
    end
    ͜ͷςετ͕௨ͬͨΒҰ൪؆୯ͳਖ਼ৗܥ͸Ͱ͖ͨ

    View Slide

  71. ͜
    ͜
    ·
    Ͱ
    ͷ
    ·
    ͱ
    Ί
    ‣ ߟ͑ͨ͜ͱΛςετʹॻ͘
    ‣ ςετʹॻ͔ΕͨίʔυΛ
    ݟͯ೰ΜͩΓۛຯͨ͠Γ͢Δ
    ‣ ςετ͕௨ΔΑ͏ʹίʔυΛॻ͘

    View Slide

  72. View Slide

  73. ߟ͑Δ
    •Railsͩͱೖྗ஋͸จࣈྻͷ
    Hashͱͯ͠औΔͷ͕Ұൠత
    • ϑΥʔϜΦϒδΣΫτͱ࣮ͯ͠૷͢Ε
    ͹Αͦ͞͏!!
    • PeopleQueryͱݺ΅͏
    ৄࡉݕࡧ

    View Slide

  74. require 'spec_helper'
    describe PeopleQuery do
    include_context \
    '4 people: alice(24), aliass(30), bob(18), chris(42)'
    describe '.new(name_like: "ali", younger_than: 25)' do
    let(:query) {
    PeopleQuery.new(name_like: 'ali', younger_than: 25)
    }
    subject { query.people }
    it { should == [alice] }
    end
    end

    View Slide

  75. ߟ͑Δ
    PeopleQueryͷAPI
    • ίϯετϥΫλͰɺHashͰෳ
    ਺ͷ৚݅ΛऔΓ
    • PeopleQuery#people Ͱ
    ActiveRecord::Relation Λฦͤ
    ͹Αͦ͞͏

    View Slide

  76. require 'spec_helper'
    describe PeopleQuery do
    include_context \
    '4 people: alice(24), aliass(30), bob(18),
    describe '.new(name_like: "ali", younger_than
    let(:query) {
    PeopleQuery.new(name_like: 'ali',
    younger_than: 25)
    }
    subject { query.people }
    it { should == [alice] }
    end
    end
    Act

    View Slide

  77. require 'spec_helper'
    describe PeopleQuery do
    include_context \
    '4 people: alice(24), aliass(30), bob(18),
    describe '.new(name_like: "ali", younger_than
    let(:query) {
    PeopleQuery.new(name_like: 'ali',
    younger_than: 25)
    }
    subject { query.people }
    it { should == [alice] }
    end
    end
    Arrange

    View Slide

  78. describe PeopleQuery do
    include_context \
    '4 people: alice(24), aliass(30), bob(18),
    describe '.new(name_like: "ali", younger_than
    let(:query) {
    PeopleQuery.new(name_like: 'ali',
    younger_than: 25)
    }
    subject { query.people }
    it { should == [alice] }
    end
    end
    Assert
    ͜Ε͕࣍ͷΰʔϧ

    View Slide

  79. http://flic.kr/p/4rxk3X
    ࣍ͷΰʔϧ΋
    ݟ͑ͨ

    View Slide

  80. require 'spec_helper'
    describe PeopleQuery do
    include_context \
    '4 people: alice(24), aliass(30), bob(18), chris(42)'
    describe '.new(name_like: "ali", younger_than: 25)' do
    let(:query) {
    PeopleQuery.new(name_like: 'ali', younger_than: 25)
    }
    subject { query.people }
    it { should == [alice] }
    end
    end
    FAQ: ςετ͸
    ͲΕ͘Β͍ॻ͘΂͖?
    A; ΰʔϧͩͱࢥ͏ͱ͜Ζ·Ͱॻ͘ͱΑ͍

    View Slide

  81. ͜
    ͜
    ·
    Ͱ
    ͷ
    ·
    ͱ
    Ί
    ‣ ೉͍͠໰୊΋ɺ·ͣʮͳʹΛʯͯ͠
    ཉ͍͔͠Λߟ͑Δ
    ‣ ςετΛ࢖ͬͯɺΰʔϧΛઃఆ͢Δ

    View Slide

  82. ߟ͑Δ
    • Person.interest_any?()Λ͏·͘
    ϥοϓͰ͖ͳ͍͔
    • Railsͷ࢓૊ΈΛߟ͑Δʹ:
    • ίϯτϩʔϥ͔Βݺ͹Εͦ͏
    • ͦͷ࣌͸ύϥϝʔλ͸จࣈྻͰ͖ͦ͏
    hobby;ͨͨͼ

    View Slide

  83. describe '.new(name_like: "ali", hobbies: "baseball")' d
    include_context \
    'there are 4 hobbies: programming, travel, BBQ and b
    let(:query) {
    PeopleQuery.new(name_like: 'ali',
    hobbies: 'baseball travel')
    }
    before do
    alice.hobbies << Hobby.where(name: 'BBQ')
    alissa.hobbies << Hobby.where(name: 'baseball')
    end
    subject { query.people }
    it { should == [alissa] }
    end 3ͭͷ৚݅Λ૊Έ߹Θͤ͸ɺ
    ͜Μͳ;͏ʹಈ͍ͯʮ΄͍͠ʯ

    View Slide

  84. cribe '.new(name_like: "ali", hobbies:
    seball")' do
    nclude_context \
    'there are 4 hobbies: programming, travel, BBQ
    baseball'
    et(:query) {
    PeopleQuery.new(name_like: 'ali',
    hobbies: 'baseball travel')
    efore do
    alice.hobbies << Hobby.where(name: 'BBQ')
    alissa.hobbies << Hobby.where(name: 'baseball')
    nd
    ubject { query.people }

    View Slide

  85. class PeopleController <
    ApplicationController
    def index
    @query =
    PeopleQuery.new(params[:q])
    @people = @query.people
    end
    end

    View Slide

  86. ͜
    ͜
    ·
    Ͱ
    ͷ
    ·
    ͱ
    Ί
    ‣ ࿅Δͱ͖͸ɺ࢖ΘΕํ΋
    ߟ͑Δ Ϣʔβͱ͔ϑϨʔϜϫʔΫͱ͔

    ‣ ςετͰͷ"DUͱɺϓϩ
    μΫτίʔυ͸Α͘ࣅΔ

    View Slide

  87. ςετۦಈ։ൃͷਐΊํ
    • ख͕͚͍ͯΔΦϒδΣΫτͷৼΔ෣͍Λ
    ߟ͑Δɺϝιου໊ɺҾ਺ɺ໭Γ஋ͳͲ
    • ؔ࿈͢ΔσʔλͳͲɺৼΔ෣͏ͨΊͷࣄ
    લ৚݅Λߟ͑Δ
    • γϯϓϧͳݕূΛॻ͘
    • ಈ͔͢

    View Slide

  88. ςετ͕։ൃΛۦಈ͢ΔϙΠϯτ
    τϥΠΤϥʔ͢Δ৔ʹͳΔ
    • ίʔυΛॻ͍ͯɺಡΜͰɺͦͯ͠ߟ͑
    Δ৔ʹͳΔɻ
    • νʔϜϝϯόʔʹ΋ɺϗϯϞϊͷίʔ
    υͰ૬ஊͰ͖Δɻ
    • ࣮ߦ·ͰͰ͖Δ!!

    View Slide

  89. think
    code
    run
    Programming workflow
    ςετ͸ɺ࣮ߦ͢Δ͜ͱͱߟ͑Δ͜ͱͱɺ
    ྆ํΛαϙʔτͯ͠։ൃΛۦಈ͢Δ

    View Slide

  90. Ԟ͕ਂ͍ ྑ͘΋ѱ͘΋

    • ͍ΖΜͳςΫχοΫ͕͋Δ
    • ϑΣΠΫ΍ࡾ֯ଌྔ
    • σʔλੜ੒ύλʔϯ
    • ϞοΫ΍ελϒ
    • assert͔Βॻ͘͜ͱ΋Α͋͘Δ
    • ͪΐ͏೉͍͠ϩδοΫͷςετͱ͔

    View Slide

  91. ૉৼΓॏཁ
    •͚ͬ͜͏୾ྗ͕͍Δ
    • ࣮૷ͷৄࡉΛߟ͍͑ͨؾ࣋ͪΛ
    ͙ͬͱת͑Δ
    •ྔ͸࣭ʹసԽ͢Δ

    View Slide

  92. View Slide

  93. View Slide

  94. View Slide

  95. ςΫχοΫΑΓ΋
    େࣄͳ͜ͱ
    ࠶ܝ

    View Slide

  96. http://flic.kr/p/zBdU7
    ςετ͸։ൃΛۦಈ͢Δ
    • run: ࣮ߦΛߏ଄Խ͢Δɻ
    • think: τϥΠ&Τϥʔͷ৔ʹͳΔɻ
    • ΋ͪΖΜɺϦϑΝΫλϦϯάΛॿ͚ͨΓ
    σάϨͷ๷ࢭʹ΋໾ཱͭ

    View Slide

  97. think
    code
    run
    Programming workflow

    View Slide

  98. think
    code
    run
    Programming workflow
    ໰୊͕೉͚͠Ε͹ͦΕ͚ͩɺ
    ಈ͔͠ͳ͕Β࡞ΕΔςετ͕໾ʹཱͭ

    View Slide

  99. Thank you for listening.
    - May it be a light for you in dark places,
    when all other lights go out.
    - May it be a light for you in dark places,
    when all other lights go out.

    View Slide