Slide 1

Slide 1 text

How to test Rails engine generator with RSpec shinjuku.rbɹ2015/06/24 @yasaichi

Slide 2

Slide 2 text

About me [1] pry(main)> me => { twitter:'@_yasaichi', github: 'yasaichi', splatoon: nil, blog: 'http://web-salad.hateblo.jp' }

Slide 3

Slide 3 text

޷͖ͳঁੑΞΠυϧ ೫໦ࡔ46

Slide 4

Slide 4 text

ಥવͰ͕͢ɺRails EngineͰ GemΛ࡞ͬͨ͜ͱ͋Δํʁ

Slide 5

Slide 5 text

Ͱ͸ɺࣗ෼ͰGeneratorΛ ॻ͍ͨ͜ͱͷ͋Δํʁ

Slide 6

Slide 6 text

Agenda • ͖͔͚ͬ • ओཁGemͰͷGeneratorʹର͢Δςετ • RspecΛ࢖ͬͯͲ͏ॻ͍͔ͨ • ײ૝ͱ·ͱΊ

Slide 7

Slide 7 text

Background • ࠷ۙࣾ಺༻GemͷGeneratorΛॻ͍ͨ
 ex: rails g mygem:install • RSpecͰςετΛॻ͜͏ͱͨ͠Β৘ใ͕
 গͳͯۤ͘࿑ͨ͠ • Ͳ͏΍ͬͯղܾ͔ͨ͠Λڞ༗͍ͨ͠

Slide 8

Slide 8 text

ओཁGemͰ͸GeneratorΛ Ͳ͏ςετ͍ͯ͠Δͷ͔

Slide 9

Slide 9 text

Overview Nothing Rspec + Gem Test::Unit airbrake doorkeeper rails_config ͳͲ draper devise

Slide 10

Slide 10 text

RSpec + Gem • RSpec͸GeneratorͷςετΛඪ४Ͱ
 αϙʔτ͍ͯ͠ͳ͍ͷͰɺGemΛ࢖͏ • generator_spec, ammeterͷ2୒ʁ • ͲͪΒ΋GitHubͰ˒50͘Β͍Ͱɺ͋·Γ
 ੝Γ্͕ΓΛײ͡ΒΕͳ͍ ٩(๑`н´๑)۶

Slide 11

Slide 11 text

Test::Unit • Rails::Generators::TestCaseͱ͍͏Ϋϥε͕
 σϑΥϧτͰ༻ҙ͞Ε͍ͯΔ • Test::UnitΛ࢖͍ͬͯΔͳΒ͜ΕͰOK • ͪͳΈʹɺgenerator_spec, ammeter͸
 ͜ΕΛ಺෦Ͱར༻͍ͯ͠Δ

Slide 12

Slide 12 text

݁ہͲ͏͔ͨ͠

Slide 13

Slide 13 text

Use "ammeter" • generatorʢൃిػʣ㲗 ammeter ʢిྲྀܭʣ • generator_specͱൺֱͯ͠matcher͕ॆ࣮
 ͍ͯ͠Δ • ϝϯς͞Εͳ͘ͳͬͨΒDraper΋ಓ࿈Εʹ
 Ͱ͖Δͱ͍͏Ṗͷ҆৺ײ͕ܾΊखʹ

Slide 14

Slide 14 text

Usage RSpec.describe MyGem::Generators::InstallGenerator, type: :generator do destination File.expand_path('../../tmp', __FILE__) before do prepare_destination # initialize ../../tmp end describe 'generated files' do before do run_generator # run "rails g my_gem:install" end # write test cases here end after(:context) do FileUtils.rm_rf(destination_root) end end

Slide 15

Slide 15 text

Matchers # ଞʹ be_a_migration, have_method ͕͋Δ # ৄ͘͠͸ https://github.com/alexrothenberg/ammeter Λࢀরͷ͜ͱ describe 'generated files' do before do run_generator # run: rails g my_gem:install end describe 'config/initializers/my_gem.rb' do subject { file('config/initializers/my_gem.rb') } it { is_expected.to exist } it { is_expected.to have_correct_syntax } it { is_expected.to contain /\AMyGem\.configure do \|config\|/ } end end

Slide 16

Slide 16 text

[IMO] • ༻ҙ͞Ε͍ͯΔmatcherΛ࢖͑͹΍Γ͍ͨ
 ͜ͱ͸͍͍ͩͨͰ͖ͯศར • ςετέʔεຖʹϑΝΠϧΛ࡞ͬͯ͸ফ͢Λ
 ܁Γฦ͢ͷ͕ͪΐͬͱؾʹͳΔ → จࣈྻͱͯ͠ग़ྗͯ͠த਎͚ͩݕ͍ࠪͨ͠

Slide 17

Slide 17 text

Conclusion • Test::UnitΛ࢖͑͹Ϩʔϧʢ˞ʣʹ৐ΕΔ
 ˞ Rails::Generators::TestCase • RSpec͸GeneratorͷςετΛඪ४Ͱαϙʔτ ͍ͯ͠ͳ͍ͷͰɺGemΛ࢖͏͜ͱʹͳΔ • GemͷதͰ͸ammeter͕͍͍ײ͡

Slide 18

Slide 18 text

Happy testing with RSpec!