Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
An RSpec 3 Talk
Search
Penelope Phippen
December 08, 2014
Technology
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
An RSpec 3 Talk
A talk about RSpec 3 that I gave at LRUG December 2014.
Penelope Phippen
December 08, 2014
More Decks by Penelope Phippen
See All by Penelope Phippen
Introducing Rubyfmt
penelope_zone
0
620
How RSpec Works
penelope_zone
0
6.8k
Quick and easy browser testing using RSpec and Rails 5.1
penelope_zone
1
110
Teaching RSpec to play nice with Rails
penelope_zone
2
180
Little machines that eat strings
penelope_zone
1
130
What is processor (brighton ruby edition)
penelope_zone
0
150
What is processor?
penelope_zone
1
390
extremely defensive coding - rubyconf edition
penelope_zone
0
300
Agile, etc.
penelope_zone
2
260
Other Decks in Technology
See All in Technology
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
200
金融の未来を考える / Thinking About the Future of Finance
ks91
PRO
0
150
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
200
プロンプト_きのこカンファレンス2026_LT
yurufuwahealer
0
130
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
0
140
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
300
LiDAR SLAMの実装とセンサ融合 ~Lie群からContinuous-Time LIOまで~
naokiakai
1
940
AWS Blocks を触ってみた/first-tach-aws-blocks
fossamagna
2
140
Baseline対応のDOMの型定義を作った
uhyo
2
660
デジタル・デザイン構想 by Sayaka Ishizuka
y150saya
0
190
Hatena Engineer Seminar 37 jj1uzh
jj1uzh
0
420
MySQL & MySQL HeatWave Report - June 2026
freshdaz
0
300
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.9k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Become a Pro
speakerdeck
PRO
31
6k
Unsuck your backbone
ammeep
672
58k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Amusing Abliteration
ianozsvald
1
220
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
An RSpec 3 Talk
a!/samphippen
RSpec RSpec ! ! RSpec 3
Upgrading
The easiest major gem upgrade you’ve ever done
The upgrade process
Be green and warning free on RSpec 2
gem “rspec”, “~> 2.99”
bundle install
fix warnings
gem “rspec”, “~> 3.0”
Done.
There is also Transpec
None
Verifying doubles
Who’s ever stubbed an object’s interface wrong?
class Foo def bar(beers) “#{beers} bottles of beer” end end
allow(Foo.new).to receive(:bare)
None
class Foo def bar(beers) “#{beers} bottles of beer” end end
allow(Foo.new).to receive(:bar).with(1,2)
None
Not enabled by default for upgrade installs
RSpec.configure do |config| config.mock_with :rspec do |mocks| mocks.verify_partial_doubles = true
end end
http://tinyurl.com/p6yk8ll
Verifying behaviour on pure doubles
double( :some_name_for_the_double, :call => :result )
instance_double( MyClass, :call => :result )
instance_double( MyClass, :call => :result )
instance_double( “MyClass”, :call => :result )
Let’s have some questions !!/samphippen
[email protected]
Also class_double and object_double
Composable matchers
One Expectation Per Test
expect(json[“foo”]).to eq(bar) expect(json[“baz”]).to eq(quz) expect(json[“boz”][“buz”]).to match(id_regex)
expect(json[“foo”]).to eq(bar) expect(json[“baz”]).to eq(quz) expect(json[“boz”][“buz”]).to match(id_regex)
Could write separate tests
That could be expensive
expect(json).to match( “foo” => bar, “baz” => quz, “boz” =>
{ “buz” => match(id_regex) } )
Match parts of hashes and arrays
{ “key” => { “key1” => value1, “key2” => value2,
} }
expect(foo).to match( “key” => a_hash_including( “key2”=> value2 ) )
{ “key” => [1,2,3] }
expect(foo).to match( “key” => an_array_including(1) )
Compound expressions via and and or
expect(alphabet).to start_with("a") expect(alphabet).to end_with("z")
expect(alphabet) .to start_with(“a”) .and end_with("z")
expect(stoplight.color) .to eq(“red") .or eq(“green") .or eq("yellow")
Nearly all existing RSpec matchers are composable
Works with custom matchers
Rails
Let’s have some questions !!/samphippen
[email protected]
OMG. Loading rails is the worst thing ever
files took 2.09 seconds to load
spec_helper is now split
spec_helper.rb Loads RSpec, not your app
rails_helper.rb Loads RSpec + whole rails app
Spec Types
RSpec rails used to be highly implicit
#spec/controllers/foo_controller_spec.rb describe FooController it “magically has get and assigns methods????”
get :index expect(assigns[:foo]).to be true end end
#spec/controllers/foo_controller_spec.rb describe FooController, :type => :controller it “gets the methods
from the metadata” get :index expect(assigns[:foo]).to be true end end
This applies to all Rails spec types
You can structure your specs however you like
If you badly need directory based spec inference
RSpec.configure do |config| config.infer_spec_type_from_file_location! end
http://tinyurl.com/kgllgtb
RSpec is trying to get less bad at patching methods
on to everything for you
Sytnax
The “a.should == b” syntax is not gone
It is deprecated
I strongly advise you to use expect(a).to eq(b) everywhere
a.should == b expect(a).to eq(b)
a.should_receive(:foo) expect(a).to receive(:foo)
a.stub(:foo) allow(a).to receive(:foo)
expect { }.to raise_error ! #is the same
a.any_instance.stub(:foo) allow_any_instance_of(a).to receive(:foo)
a.any_instance.should_receive(:foo) expect_any_instance_of(a).to receive(:foo)
RSpec also now has a “no monkey patching” mode
RSpec 2 monkey patches #describe
describe “” do describe “” do end it “” do
end end
RSpec.describe “” do describe “” do end it “” do
end end
bare describe is still available in RSpec contexts
This one might trip you up
be_true be_false
be_truthy be_falsy be_falsey
be true be false
Let’s have some questions a!/samphippen
[email protected]