Slide 1

Slide 1 text

Suggestion for 
 RSpec Custom Matcher ! ΧελϜϚονϟʔΛ ྲྀߦΒ͍ͤͨ MOROHASHI Kyosuke @2014-03-01 ԭೄRubyձٞ01

Slide 2

Slide 2 text

ॾڮګհ(@moro) Kyosuke MOROHASHI

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Suggestion for 
 RSpec Custom Matcher ! ΧελϜϚονϟʔΛ ྲྀߦΒ͍ͤͨ MOROHASHI Kyosuke @2014-03-01 ԭೄRubyձٞ01

Slide 7

Slide 7 text

Ϣχοτςετʹ ͋Γ͕ͪͳ͜ͱ

Slide 8

Slide 8 text

✓ ࡉ͔͍ example ͕͍ͬͺ͍ ✓ example ͷू·Γ͔Βʮৼ Δ෣͍ʯΛ૝૾ͮ͠Β͍ ✓ ύϥϝλϥΠζਏ͍

Slide 9

Slide 9 text

let(:job) { create(:job) } ! before do job.import_task_statuses( [:success, :doing, :success, :error] ) end ! specify { expect(job.tasks.where(status: :success)).to have(2).records } ! specify { expect(job.tasks.where(status: :doing)).to have(1).records }

Slide 10

Slide 10 text

Rails doesn’t save YOUR Applications! (it’s an awesome FRAMEWORK!) http://sapporo.rubykaigi.org/2012/ja/schedule/details/79.html http://sapporo.rubykaigi.org/2012/ja/schedule/details/79.html

Slide 11

Slide 11 text

Rails doesn’t save YOUR Applications! (it’s an awesome FRAMEWORK!) http://sapporo.rubykaigi.org/2012/ja/schedule/details/79.html

Slide 12

Slide 12 text

Rails doesn’t save YOUR Applications! (it’s an awesome FRAMEWORK!) http://sapporo.rubykaigi.org/2012/ja/schedule/details/79.html also RSpec, too

Slide 13

Slide 13 text

Test facilities for
 YOUR Applications.

Slide 14

Slide 14 text

✓ Arrange: Smart factory &/or
 Shared context ✓ Act: Your nice facade in 
 production code ✓ Assert: ?

Slide 15

Slide 15 text

CustomMatcher ͷ ͝ఏҊ

Slide 16

Slide 16 text

ΞϓϦέʔγϣϯ εέʔϧͷޠኮ

Slide 17

Slide 17 text

RSpec::Matchers. define(:matchers_name) do |expected| match do |actual| actual == expected end end

Slide 18

Slide 18 text

RSpec::Matchers. define(:matchers_name) do |expected| match do |actual| actual == expected end end

Slide 19

Slide 19 text

ΞϓϦέʔγϣϯ εέʔϧͷޠኮ

Slide 20

Slide 20 text

RSpec::Matchers. define(:have_task_statuses) do |expectation| ! match do |actual| statuses = actual.tasks.each_with_object(Hash.new( hash[t.status] += 1 } ! expect(statuses).to eq expectation end end

Slide 21

Slide 21 text

let(:job) { create(:job) } ! before do job.import_task_statuses( [:success, :doing, :success, :error] ) end ! specify do expect(job).to have_task_statuses( success: 2, doing: 1, error: 1 ) end

Slide 22

Slide 22 text

let(:job) { create(:job) } ! before do job.import_task_statuses( [:success, :doing, :success, :error] ) end ! specify { expect(job.tasks.where(status: :success)).to have(2).records } ! specify { expect(job.tasks.where(status: :doing)).to have(1).records } Before

Slide 23

Slide 23 text

let(:job) { create(:job) } ! before do job.import_task_statuses( [:success, :doing, :success, :error] ) end ! specify do expect(job).to have_task_statuses( success: 2, doing: 1, error: 1 ) end After

Slide 24

Slide 24 text

https://relishapp.com/rspec/rspec-expectations/v/3-0/docs/custom-matchers

Slide 25

Slide 25 text

·ͱΊ

Slide 26

Slide 26 text

✓ CustomMatcher؆୯Ͱ͠ΐ ✓ ͪΐͬͱͣͭҭͯΕ͹OK

Slide 27

Slide 27 text

Rails doesn’t save YOUR Applications! (it’s an awesome FRAMEWORK!) http://sapporo.rubykaigi.org/2012/ja/schedule/details/79.html also RSpec, too

Slide 28

Slide 28 text

ΞϓϦέʔγϣϯϩδοΫΛ ݕূ͢ΔͨΊͷޠኮΛ࡞Δͱ ΞϓϦέʔγϣϯϩδοΫΛ ݕূ͠΍͘͢ͳΔ

Slide 29

Slide 29 text

http://martinfowler.com/articles/rubyAtThoughtWorks/metaprogramming.png