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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Penelope Phippen
December 08, 2014
Technology
0
150
An RSpec 3 Talk
A talk about RSpec 3 that I gave at LRUG December 2014.
Penelope Phippen
December 08, 2014
Tweet
Share
More Decks by Penelope Phippen
See All by Penelope Phippen
Introducing Rubyfmt
penelope_zone
0
600
How RSpec Works
penelope_zone
0
6.8k
Quick and easy browser testing using RSpec and Rails 5.1
penelope_zone
1
100
Teaching RSpec to play nice with Rails
penelope_zone
2
160
Little machines that eat strings
penelope_zone
1
120
What is processor (brighton ruby edition)
penelope_zone
0
130
What is processor?
penelope_zone
1
380
extremely defensive coding - rubyconf edition
penelope_zone
0
290
Agile, etc.
penelope_zone
2
250
Other Decks in Technology
See All in Technology
「使いにくい」も「運用疲れ」も卒業する UIデザイナーとエンジニアが創る持続可能な内製開発
nrinetcom
PRO
1
770
Databricks (と気合い)で頑張るAI Agent 運用
kameitomohiro
0
350
Exadata Fleet Update
oracle4engineer
PRO
0
1.3k
Data Hubグループ 紹介資料
sansan33
PRO
0
2.8k
AIエージェントで変わる開発プロセス ― レビューボトルネックからの脱却
lycorptech_jp
PRO
2
830
LY Tableauでの Tableau x AIの実践 (at Tableau Now! - 2026-02-26)
yoshitakaarakawa
0
1.1k
【SLO】"多様な期待値" と向き合ってみた
z63d
2
280
クラウド時代における一時権限取得
krrrr38
1
150
Oracle Cloud Infrastructure:2026年2月度サービス・アップデート
oracle4engineer
PRO
0
140
メタデータ同期に潜んでいた問題 〜 Cache Stampede 時の Cycle Wait を⾒つけた話
lycorptech_jp
PRO
0
120
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
6
1.7k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
14k
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
14k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
860
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
65
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
200
A better future with KSS
kneath
240
18k
4 Signs Your Business is Dying
shpigford
187
22k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
sira's awesome portfolio website redesign presentation
elsirapls
0
170
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.3k
First, design no harm
axbom
PRO
2
1.1k
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]