Slide 1

Slide 1 text

Keiko Kaneko ( @neko314 ) 2021.10.22 (Fri) Kaigi on Rails 2021 Day1 FactoryBot ͷ build strategy Λ ͍͍ײ͡௚ͯ͘͠ΕΔ gem Λ ࡞ͬͨ࿩

Slide 2

Slide 2 text

• ͔Ͷ͜ɹ͚͍͜ • GitHub: neko314 / Twitter: neko314_ • Asakusa.rb • גࣜձࣾΞϯυύου • ܹਏ͸ϥΠϑϫʔΫ • ۦ͚ग़͠؍Δক ࣗݾ঺հ

Slide 3

Slide 3 text

• gem ͷ঺հ • ಈػ • ࣮૷ • ੒Ռ • ͜Ε͔Β ΞδΣϯμ

Slide 4

Slide 4 text

ͦͷલʹగਖ਼ 🙏

Slide 5

Slide 5 text

FactoryBot ͷ build strategy Λ͍͍ײ ͡௚ͯ͘͠ΕΔ gem Λ࡞ͬͨ࿩ ↓ FactoryBot ͷ build strategy Λ͍͍ײ ͡ʹڭ͑ͯ͘ΕΔ gem Λ࡞͍ͬͯΔ࿩

Slide 6

Slide 6 text

վΊͯ…

Slide 7

Slide 7 text

🤖 FactoryStrategist ͷ͝঺հ🕵 https://github.com/neko314/factory_strategist

Slide 8

Slide 8 text

FactoryStrategist ͱ͸ FactoryBot ͷ build strategy Λ ͍͍ײ͡ʹڭ͑ͯ͘ΕΔ gem

Slide 9

Slide 9 text

σϞ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb

Slide 10

Slide 10 text

σϞ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb

Slide 11

Slide 11 text

σϞ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb "./spec/models/user_spec.rb:4 create can be replaced to build" . Finished in 0.03062 seconds ( fi les took 5.47 seconds to load)1 example, 0 failures

Slide 12

Slide 12 text

σϞ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb "./spec/models/user_spec.rb:4 create can be replaced to build" . Finished in 0.03062 seconds ( fi les took 5.47 seconds to load)1 example, 0 failures

Slide 13

Slide 13 text

ಈػͷ࿩

Slide 14

Slide 14 text

• ςετΛ଎͍ͨ͘͠ • Ͱ͖Δָ͚ͩʹίʔυΛॻ͖͍ͨ • ςετͰ͸ʮԿΛςετ͢Δ͔ʯʹ஫ྗͯ͠ ʮͲ͏ॻ͔͘ʯʹΤωϧΪʔΛ஫͕ͳͯ͘΋ྑ ͍ͨ͘͠ ಈػ

Slide 15

Slide 15 text

• ࡢ೥ͷ Kaigi on Rails ͷ toshimaru ͞Μͷ͓࿩ • https://speakerdeck.com/toshimaru/ factorybot-the-right-way ಈػ - ςετΛ଎͍ͨ͘͠

Slide 16

Slide 16 text

• "build strategies"ͱ͸ • https://github.com/thoughtbot/factory_bot/ blob/master/README.md • https://github.com/thoughtbot/factory_bot/ blob/master/GETTING_STARTED.md ಈػ - ςετΛ଎͍ͨ͘͠

Slide 17

Slide 17 text

• "build strategies"ͱ͸ ಈػ - ςετΛ଎͍ͨ͘͠

Slide 18

Slide 18 text

• build strategies • create • build • build_stubbed • attributes_for ಈػ - ςετΛ଎͍ͨ͘͠

Slide 19

Slide 19 text

• build strategies • create • build • build_stubbed • attributes_for ಈػ - ςετΛ଎͍ͨ͘͠ ͜ΕΒΛ࢖͍෼͚͍ͨ

Slide 20

Slide 20 text

• ࣮ࡍͷྫʢͱ͋ΔϦϙδτϦͷ User Ϟσϧʣ ಈػ - ςετΛ଎͍ͨ͘͠ create 0.945ms build 0.001ms build_stubbed 0.004ms

Slide 21

Slide 21 text

• ࣮ࡍͷྫʢͱ͋ΔϦϙδτϦͷ User Ϟσϧʣ ಈػ - ςετΛ଎͍ͨ͘͠ create 0.945ms build 0.001ms build_stubbed 0.004ms

Slide 22

Slide 22 text

• ࣮ࡍͷྫʢͱ͋ΔϦϙδτϦͷ User Ϟσϧʣ ಈػ - ςετΛ଎͍ͨ͘͠ create 0.945ms build 0.001ms build_stubbed 0.004ms 🤔

Slide 23

Slide 23 text

create Λ build / build_stubbed ʹ͢Δ ͜ͱͰςετΛ଎͘Ͱ͖Δ ಈػ - ςετΛ଎͍ͨ͘͠

Slide 24

Slide 24 text

طʹ͋Δෆཁͳ create Λ΍ΊΔ ৽ͨʹෆཁͳ create Λ૿΍͞ͳ͍ ಈػ - ςετΛ଎͍ͨ͘͠

Slide 25

Slide 25 text

طଘίʔυ΋৽نͷίʔυ΋νΣοΫͯ͠΄͍͠

Slide 26

Slide 26 text

💡ͦ͏͍͏ίʔυΛॻ͍ͯΈΑ͏

Slide 27

Slide 27 text

🤖 FactoryStrategist 🕵 https://github.com/neko314/factory_strategist

Slide 28

Slide 28 text

͔͜͜Β࣮૷ͷ࿩

Slide 29

Slide 29 text

•Rails ΞϓϦͰ͋Δ͜ͱ •RSpec Λར༻͍ͯ͠Δ͜ͱ ࣮૷ - ࠓճͷલఏ

Slide 30

Slide 30 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ 2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 3. ࠷దͳ build strategy ΛબͿ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 31

Slide 31 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ 2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 3. ࠷దͳ build strategy ΛબͿ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 32

Slide 32 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ -> ʮͦͷ··ʯͳͷͰಛʹ΍Δ͜ͱͳ͠ʂ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 33

Slide 33 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ 2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 3. ࠷దͳ build strategy ΛબͿ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 34

Slide 34 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 35

Slide 35 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 2.2. ςετίʔυΛมߋ࣮ͯ͠ݱ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 36

Slide 36 text

• ෳ੡ͨ͠ϑΝΠϧΛॻ͖׵͑ͯςετ͢Δ • DB ࣗମ͔Β INSERT ͞Ε͍ͯΔ͕ SELECT ͞ Ε͍ͯͳ͍Ϩίʔυ͕ͳ͍͔Λௐ΂Δ ࣮૷ - ࠾༻͠ͳ͔ͬͨ͜ͱ

Slide 37

Slide 37 text

• ෳ੡ͨ͠ϑΝΠϧΛॻ͖׵͑ͯςετ͢Δ → 😇ແݶϧʔϓ • DB ࣗମ͔Β INSERT ͞Ε͍ͯΔ͕ SELECT ͞ Ε͍ͯͳ͍Ϩίʔυ͕ͳ͍͔Λௐ΂Δ → ΞϓϦέʔγϣϯ͔Βͷૢ࡞͕೉͔ͬͨ͠ ❓DBͷछྨʹ΋ΑΓͦ͏ʁ ࣮૷ - ࠾༻͠ͳ͔ͬͨ͜ͱ

Slide 38

Slide 38 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 2.2. ςετίʔυΛมߋ࣮ͯ͠ݱ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 39

Slide 39 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 2.2. ςετίʔυΛมߋ࣮ͯ͠ݱ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 40

Slide 40 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ alias_method :create, :build alias_method :create, :build_stubbed

Slide 41

Slide 41 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 🙆ʮ࡞Γͳ͕ΒඞཁͳॲཧΛ੔ཧ͍ͯ͘͠ʯ ͕Ͱ͖ͨͷͰΑ͔ͬͨ ࣮૷ - ΍Γ͍ͨॲཧ alias_method :create, :build alias_method :create, :build_stubbed

Slide 42

Slide 42 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 🙅1ͭ1ͭͷݕࠪ͸Ͱ͖ͳ͍ ࣮૷ - ΍Γ͍ͨॲཧ alias_method :create, :build alias_method :create, :build_stubbed

Slide 43

Slide 43 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 2.2. ςετίʔυΛมߋ࣮ͯ͠ݱ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 44

Slide 44 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 2.2. ςετίʔυΛมߋ࣮ͯ͠ݱ͢Δ ࣮૷ - ΍Γ͍ͨॲཧ ҰମͲ͏΍ͬͯ🤔

Slide 45

Slide 45 text

2. create ͷՕॴΛ build ΍ build_stubbed ʹͯ͠ ςετΛ࣮ߦ͢Δ 2.1. ςετίʔυΛมߋͤͣʹ࣮ݱ͢Δ 2.2. ςετίʔυΛมߋ࣮ͯ͠ݱ͢Δ ϝλσʔλͱ͍ͯ࣋ͬͯ͠Δ࣮ߦ͢΂͖ςε τίʔυΛղੳͯ͠ॻ͖׵͑Δ ࣮૷ - ݁࿦

Slide 46

Slide 46 text

…೉͍͠

Slide 47

Slide 47 text

✂೉͍͠໰୊͸খ͘͞෼ղ͢Δ✂

Slide 48

Slide 48 text

• ͘͢͝γϯϓϧͳςετͰߟ͑Δ͜ͱʹ͢Δ ࣮૷ # sample_app/spec/models/user_spec.rb 1. require 'rails_helper' 2. 3. RSpec.describe User, type: :model do 4. it { expect(FactoryBot.create(:user)).to be_valid } 5. end

Slide 49

Slide 49 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end

Slide 50

Slide 50 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end ςετΛ࣮ߦ

Slide 51

Slide 51 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end FactoryBotΛར༻͍ͯ͠Ε͹ create Ͱ example.run build Ͱ example.run build_stubbed Ͱ example.run Ͱςετ͕௨Δ͔Ͳ͏͔Λ͔֬ΊΔ

Slide 52

Slide 52 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end ԿΛ͍ͯ͠Δͷ͔?? 🤔

Slide 53

Slide 53 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end # class RSpec::Core::Example::Procsy def call(*args, &block) @executed = true @proc.call(*args, &block) end alias run call

Slide 54

Slide 54 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end # class RSpec::Core::Example::Procsy def call(*args, &block) @executed = true @proc.call(*args, &block) end alias run call

Slide 55

Slide 55 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end # class RSpec::Core::Example::Procsy def call(*args, &block) @executed = true @proc.call(*args, &block) end alias run call ͜ͷத਎͸?? 🤔

Slide 56

Slide 56 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end example.example.metadata[:block] = > #

Slide 57

Slide 57 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end example.example.metadata[:block] = > # # sample_app/spec/models/user_spec.rb 1. require 'rails_helper' 2. 3. RSpec.describe User, type: :model do 4. it { expect(FactoryBot.create(:user)).to be_valid } 5. end

Slide 58

Slide 58 text

࣮૷ - Ξϓϩʔν 1. RSpec.conf i gure do |conf i g| 2. conf i g.around(:example) do |example| 3. example.run 4. end 5. end example.example.metadata[:block] = > # # sample_app/spec/models/user_spec.rb 1. require 'rails_helper' 2. 3. RSpec.describe User, type: :model do 4. it { expect(FactoryBot.create(:user)).to be_valid } 5. end

Slide 59

Slide 59 text

औಘͨ͠procʹͲ͏खΛೖΕΔ͔ʁ🤔 ࣮૷

Slide 60

Slide 60 text

΍Γ͍ͨ͜ͱΛ֬ೝ ࣮૷ # sample_app/spec/models/user_spec.rb 1. require 'rails_helper' 2. 3. RSpec.describe User, type: :model do 4. it { expect(FactoryBot.create(:user)).to be_valid } 5. end

Slide 61

Slide 61 text

΍Γ͍ͨ͜ͱΛ֬ೝ ࣮૷ # sample_app/spec/models/user_spec.rb 1. require 'rails_helper' 2. 3. RSpec.describe User, type: :model do 4. it { expect(FactoryBot.create(:user)).to be_valid } 5. end build ΍ build_stubbed ʹ͍ͨ͠

Slide 62

Slide 62 text

΍Γ͍ͨ͜ͱΛ֬ೝ ࣮૷ # sample_app/spec/models/user_spec.rb 1. require 'rails_helper' 2. 3. RSpec.describe User, type: :model do 4. it { expect(FactoryBot.create(:user)).to be_valid } 5. end ·ͣ build ʹ͢Δ͜ͱΛߟ͑Δ

Slide 63

Slide 63 text

࣮૷ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ Ճ޻ͨ͠จࣈྻ ϝλσʔλͷ Proc ΦϒδΣΫτ ࣮ߦ݁Ռ

Slide 64

Slide 64 text

࣮૷ ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ

Slide 65

Slide 65 text

࣮૷ example.example.metadata[:block].to_s ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ to_s ΍ inspect ͯ͠ΈΔ

Slide 66

Slide 66 text

࣮૷ example.example.metadata[:block].to_s # = > "#" ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ to_s ΍ inspect ͯ͠ΈΔ

Slide 67

Slide 67 text

࣮૷ example.example.metadata[:block].to_s # = > "#" ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ to_s ΍ inspect ͯ͠ΈΔ 😇

Slide 68

Slide 68 text

࣮૷ RubyVM : : AbstractSyntaxTree.of(example.example.metadata[:bl ock]) ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ ASTΛऔಘͯ͠ΈΔ

Slide 69

Slide 69 text

࣮૷ RubyVM : : AbstractSyntaxTree.of(example.example.metadata[:bl ock]) # = > # ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ ASTΛऔಘͯ͠ΈΔ

Slide 70

Slide 70 text

࣮૷ RubyVM : : AbstractSyntaxTree.of(example.example.metadata[:bl ock]) # = > # ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ ASTΛऔಘͯ͠ΈΔ 😇Ճ޻ʹࣦഊͯ͠அ೦

Slide 71

Slide 71 text

࣮૷ module ProcParser ref i ne Proc do def body # RubyVM : : InstructionSequence ͰऔಘͰ͖Δ γʔέϯεΛ΋ͱʹ spec ϑΝΠϧ͔ΒจࣈྻΛऔಘ end end end ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ

Slide 72

Slide 72 text

࣮૷ example.example.metadata[:block].body ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ

Slide 73

Slide 73 text

࣮૷ example.example.metadata[:block].body # = > " expect(FactoryBot.create(:user)).to be_valid " ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ

Slide 74

Slide 74 text

࣮૷ example.example.metadata[:block].body # = > " expect(FactoryBot.create(:user)).to be_valid " ϝλσʔλͷ Proc ΦϒδΣΫτ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ 🎉🎉🎉🎉🎉🎉

Slide 75

Slide 75 text

࣮૷ 🙏 ͘͢͝ࢀߟʹ͠·ͨ͠ʂ 🙏 Ruby ͷϒϩοΫߏจͷத਎Λจࣈྻͱͯ͠औಘ͢Δ by @osyo-manga https://secret-garden.hatenablog.com/entry/ 2019/09/08/145037

Slide 76

Slide 76 text

࣮૷ ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ Ճ޻ͨ͠จࣈྻ " expect(FactoryBot.create(:user)).to be_valid\n"

Slide 77

Slide 77 text

࣮૷ " expect(FactoryBot.create(:user)).to be_valid\n" .gsub("create", "build") ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ Ճ޻ͨ͠จࣈྻ " expect(FactoryBot.create(:user)).to be_valid\n"

Slide 78

Slide 78 text

࣮૷ " expect(FactoryBot.create(:user)).to be_valid\n" .gsub("create", "build") ఆٛ͞Ε͍ͯΔखଓ͖ͷจࣈྻ Ճ޻ͨ͠จࣈྻ " expect(FactoryBot.create(:user)).to be_valid\n" " expect(FactoryBot.build(:user)).to be_valid\n"

Slide 79

Slide 79 text

࣮૷ Ճ޻ͨ͠จࣈྻ จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ " expect(FactoryBot.build(:user)).to be_valid\n"

Slide 80

Slide 80 text

࣮૷ new_body = "Proc.new { " expect(FactoryBot.build(:user)).to be_valid\n" }" eval(new_body) Ճ޻ͨ͠จࣈྻ จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ " expect(FactoryBot.build(:user)).to be_valid\n"

Slide 81

Slide 81 text

࣮૷ new_body = "Proc.new { " expect(FactoryBot.build(:user)).to be_valid\n" }" eval(new_body) Ճ޻ͨ͠จࣈྻ จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ " expect(FactoryBot.build(:user)).to be_valid\n" #

Slide 82

Slide 82 text

࣮૷ new_example = eval(new_body) # = > # จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ ࣮ߦ݁Ռ

Slide 83

Slide 83 text

࣮૷ def run_successfully?(example) example.call true rescue StandardError false end จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ ࣮ߦ݁Ռ

Slide 84

Slide 84 text

࣮૷ new_example = eval(new_body) # = > # จࣈྻ͔Βੜ੒ͨ͠ Proc ΦϒδΣΫτ ࣮ߦ݁Ռ run_successfully?(new_example) True / False

Slide 85

Slide 85 text

࣮૷ Ҏ্ ͕ create Λ build ʹͯ͠ςετΛ࣮ߦ͢Δํ๏Ͱͨ͠ build_stubbed ΋ಉ༷Ͱ͢

Slide 86

Slide 86 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ 2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 3. ࠷దͳ build strategy ΛબͿ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 87

Slide 87 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ 2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 3. ࠷దͳ build strategy ΛબͿ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 88

Slide 88 text

1. create ͍ͯ͠ΔςετΛͦͷ··࣮ߦ͢Δ 2. create ͷՕॴΛ build ΍ build_stubbed ʹ͠ ͯςετΛ࣮ߦ͢Δ 3. ࠷దͳ build strategy ΛબͿ 3.1. ϝοηʔδΛग़ྗ ࣮૷ - ΍Γ͍ͨॲཧ

Slide 89

Slide 89 text

࣮૷ ࣮ߦ݁Ռ build strategy ςετ͕௨Βͳ͍ - build Ͱύε build build_stubbed Ͱύε build_stubbed create Ͱύε create build strategyͷબͼํ

Slide 90

Slide 90 text

🎉੒Ռ🎉

Slide 91

Slide 91 text

੒Ռ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb "./spec/models/user_spec.rb:4 create can be replaced to build" . Finished in 0.03062 seconds ( fi les took 5.47 seconds to load)1 example, 0 failures

Slide 92

Slide 92 text

੒Ռ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb "./spec/models/user_spec.rb:4 create can be replaced to build" . Finished in 0.03062 seconds ( fi les took 5.47 seconds to load)1 example, 0 failures

Slide 93

Slide 93 text

੒Ռ $ FATORYSTRATEGIST=1 bin/rspec spec/models/user_spec.rb "./spec/models/user_spec.rb:4 create can be replaced to build" . Finished in 0.03062 seconds ( fi les took 5.47 seconds to load)1 example, 0 failures 🎉🎉🎉🎉🎉🎉

Slide 94

Slide 94 text

͜Ε͔Βͷ࿩

Slide 95

Slide 95 text

• ࡶͳ gsub Λ΍Ίͯʮ1ͭ1ͭͷ create ΛνΣο Ϋ͢ΔʯΛ࣮ݱ͍ͨ͠ • ΑΓෳࡶͳςετίʔυʹରԠ͍ͨ͠ • ग़ྗϝοηʔδΛΘ͔Γ΍͍ͨ͘͢͠ • ଞͷςετϑϨʔϜϫʔΫͰ΋࢖͑ΔΑ͏ʹͨ͠ ͍ ͜Ε͔Β΍Γ͍ͨ͜ͱ

Slide 96

Slide 96 text

• ͜Μͳʹ೉͍͠ͱ͸… • ASTɺISeq ΛॳΊͯࣗ෼Ͱ৮ͬͨʂ • Ruby 3.1 ͷ AST ָ͕͠Έ • ࢼߦࡨޡ͸͍͍ͧ ײ૝

Slide 97

Slide 97 text

͋Γ͕ͱ͏͍͟͝·ͨ͠🙂