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
150
0
Share
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
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
170
Little machines that eat strings
penelope_zone
1
120
What is processor (brighton ruby edition)
penelope_zone
0
140
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
OpenClaw初心者向けセミナー / OpenClaw Beginner Seminar
cmhiranofumio
0
230
ThetaOS - A Mythical Machine comes Alive
aslander
0
240
「活動」は激変する。「ベース」は変わらない ~ 4つの軸で捉える_AI時代ソフトウェア開発マネジメント
sentokun
0
140
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
10
77k
Babylon.js を使って試した色々な内容 / Various things I tried using Babylon.js / Babylon.js 勉強会 vol.5
you
PRO
0
200
JSTQB Expert Levelシラバス「テストマネジメント」日本語版のご紹介
ymty
0
110
出版記念イベントin大阪「書籍紹介&私がよく使うMCPサーバー3選と社内で安全に活用する方法」
kintotechdev
0
140
「できない」のアウトプット 同人誌『精神を壊してからの』シリーズ出版を 通して得られたこと
comi190327
3
530
OPENLOGI Company Profile
hr01
0
83k
Cortex Codeでデータの仕事を全部Agenticにやりきろう!
gappy50
0
210
BFCacheを活用して無限スクロールのUX を改善した話
apple_yagi
0
140
Kubernetesの「隠れメモリ消費」によるNode共倒れと、Request適正化という処方箋
g0xu
0
170
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
110
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
The Pragmatic Product Professional
lauravandoore
37
7.2k
We Are The Robots
honzajavorek
0
210
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
99
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Claude Code のすすめ
schroneko
67
220k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
230
The browser strikes back
jonoalderson
0
870
Marketing to machines
jonoalderson
1
5.1k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
450
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]