Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
630
How RSpec Works
penelope_zone
0
6.9k
Quick and easy browser testing using RSpec and Rails 5.1
penelope_zone
1
120
Teaching RSpec to play nice with Rails
penelope_zone
2
190
Little machines that eat strings
penelope_zone
1
150
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
270
Other Decks in Technology
See All in Technology
初対面のメンバーがチームを組み、Claude Codeでゼロからサービスをリリース
mkdev10
1
110
3つのアプローチで目指す チームを強くするAI駆動開発
thkt
0
140
メルペイ 会計システム概要と歴史
mewuto
0
200
事業活動を AI Ready にする攻めと守りのデータエンジニアリング / data-engineering-for-ai-ready-business
pei0804
6
2.3k
Incremental HTTP
kazuho
5
2.1k
転んだ話が背中を預ける理由になる / A_story_about_falling_down_gives_you_a_reason_to_watch_each_other_s_backs.pdf
pauli
3
340
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
0
200
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
0
1k
今こそ知りたいAmplifyGen2
mkdev10
2
160
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
220
自分で立ててみるLLMサービス
y_sera15
0
150
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
770
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
174
15k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Navigating Team Friction
lara
192
16k
Discover your Explorer Soul
emna__ayadi
2
1.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
530
The browser strikes back
jonoalderson
0
1.8k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
210
Optimizing for Happiness
mojombo
378
71k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
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]