SlideShare a Scribd company logo
5 minutes intro into
Test::Spec
BDD testing system for Perl
use Test::Spec;
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Standing on the shoulders of giants.
Test::Builder,Test::More, ...
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Behavior-Driven Development
sub fooadd : Tests {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
is( $calculator->add('//;n1,1'), 2);
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
sub add : Tests {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
}
sub custom_delimiters : Tests {
is( $calculator->add('//;n1,1'), 2);
}
sub holidays : Tests {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
sub add_supports_simple_calculations_on_regular_day : Tests {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
}
sub add_supports_custom_delimiters_on_regular_day : Tests {
is( $calculator->add('//;n1,1'), 2);
}
sub add_throws_exception_on_holidays : Tests {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
sub add_returns_zero_for_empty_input_on_regular_day : Tests {
is( $calculator->add(''), 0);
}
sub add_returns_given_number_for_single_number_input_on_regular_day : Tests {
is( $calculator->add('1'), 1);
}
sub add_returns_sum_of_comma_delimited_numbers_on_regular_day : Tests {
is( $calculator->add('1,1'), 2);
}
sub add_throws_exception_for_any_given_input_on_holidays : Tests {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
}
vs Test::Class
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Behavior-Driven Development
StringCalculator
on regular day
supports basic calculations
supports custom delimiters
on holidays
throws exception for any input
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Easy mocks/stubs
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => () );
};
describe "on regular day" => sub {
before each => sub { Calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { Calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Easy mocks/stubs
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
describe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Multiple before/after blocks
describe "StringCalculator" => sub {
my $calculator;
my $calendar;
before each => sub {
$calculator = StringCalculator->new( calendar => ( $calendar = stub() ) );
};
xdescribe "on regular day" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub {
is( $calculator->add(''), 0, 'returns zero for empty input');
is( $calculator->add('1'), 1, 'returns given number for single number input');
is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');
};
it "supports custom delimiters" => sub {
is( $calculator->add('//;n1,1'), 2);
};
};
describe "on holidays" => sub {
before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
xit "throws exception for any input" => sub {
eval { $calculator->add(); };
like( $@, qr/HolidaysError/ );
};
};
};
Shortcuts
That’s All!

More Related Content

What's hot (20)

PDF
Symfony CoP: Form component
Samuel ROZE
 
KEY
Zend framework service
Michelangelo van Dam
 
PDF
Command Bus To Awesome Town
Ross Tuck
 
PDF
CQRS and Event Sourcing in a Symfony application
Samuel ROZE
 
PPTX
Symfony2 your way
Rafał Wrzeszcz
 
PDF
Models and Service Layers, Hemoglobin and Hobgoblins
Ross Tuck
 
TXT
Java day9n
vacbalolenvadi90
 
KEY
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Masahiro Nagano
 
PDF
R57shell
ady36
 
PDF
Your Second iPhone App - Code Listings
Vu Tran Lam
 
PDF
(PHPers Wrocław #5) How to write valuable unit test?
RST Software Masters
 
PDF
Min-Maxing Software Costs
Konstantin Kudryashov
 
PDF
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
PDF
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
Matthias Noback
 
PDF
A Series of Fortunate Events - Symfony Camp Sweden 2014
Matthias Noback
 
PDF
AngularJs
Hossein Baghayi
 
PDF
Things I Believe Now That I'm Old
Ross Tuck
 
PDF
Dealing with Legacy PHP Applications
Clinton Dreisbach
 
PDF
How te bring common UI patterns to ADF
Getting value from IoT, Integration and Data Analytics
 
PPTX
Building secured wordpress themes and plugins
Tikaram Bhandari
 
Symfony CoP: Form component
Samuel ROZE
 
Zend framework service
Michelangelo van Dam
 
Command Bus To Awesome Town
Ross Tuck
 
CQRS and Event Sourcing in a Symfony application
Samuel ROZE
 
Symfony2 your way
Rafał Wrzeszcz
 
Models and Service Layers, Hemoglobin and Hobgoblins
Ross Tuck
 
Java day9n
vacbalolenvadi90
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Masahiro Nagano
 
R57shell
ady36
 
Your Second iPhone App - Code Listings
Vu Tran Lam
 
(PHPers Wrocław #5) How to write valuable unit test?
RST Software Masters
 
Min-Maxing Software Costs
Konstantin Kudryashov
 
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
Matthias Noback
 
A Series of Fortunate Events - Symfony Camp Sweden 2014
Matthias Noback
 
AngularJs
Hossein Baghayi
 
Things I Believe Now That I'm Old
Ross Tuck
 
Dealing with Legacy PHP Applications
Clinton Dreisbach
 
How te bring common UI patterns to ADF
Getting value from IoT, Integration and Data Analytics
 
Building secured wordpress themes and plugins
Tikaram Bhandari
 

Similar to Perl Test::Spec in 5 minutes (20)

PDF
Rakudo
awwaiid
 
KEY
PHPSpec BDD for PHP
Marcello Duarte
 
PDF
TDD with PhpSpec - Lone Star PHP 2016
CiaranMcNulty
 
PDF
Una historia de ds ls en ruby
Leonardo Soto
 
KEY
Good Evils In Perl (Yapc Asia)
Kang-min Liu
 
PDF
Lecture19-20
tutorialsruby
 
PDF
Lecture19-20
tutorialsruby
 
PDF
BDD For Zend Framework With PHPSpec
Marcello Duarte
 
PDF
PHPSpec BDD Framework
Marcello Duarte
 
PDF
Introduction to Moose
thashaa
 
PDF
O CPAN tem as ferramentas que você precisa para fazer TDD em Perl, o Coding D...
Rodolfo Carvalho
 
PPTX
Migrating to Puppet 4.0
Puppet
 
ODP
Advanced Perl Techniques
Dave Cross
 
PPT
Basic perl programming
Thang Nguyen
 
KEY
Tdd for BT E2E test community
Kerry Buckley
 
PDF
Enums In the Wild at PHP[tek] Conference 2025
Dana Luther
 
PDF
Testing With Test::Class
Curtis Poe
 
PDF
Perl Bag of Tricks - Baltimore Perl mongers
brian d foy
 
PDF
Practical approach to perl day1
Rakesh Mukundan
 
PDF
TDD with PhpSpec
CiaranMcNulty
 
Rakudo
awwaiid
 
PHPSpec BDD for PHP
Marcello Duarte
 
TDD with PhpSpec - Lone Star PHP 2016
CiaranMcNulty
 
Una historia de ds ls en ruby
Leonardo Soto
 
Good Evils In Perl (Yapc Asia)
Kang-min Liu
 
Lecture19-20
tutorialsruby
 
Lecture19-20
tutorialsruby
 
BDD For Zend Framework With PHPSpec
Marcello Duarte
 
PHPSpec BDD Framework
Marcello Duarte
 
Introduction to Moose
thashaa
 
O CPAN tem as ferramentas que você precisa para fazer TDD em Perl, o Coding D...
Rodolfo Carvalho
 
Migrating to Puppet 4.0
Puppet
 
Advanced Perl Techniques
Dave Cross
 
Basic perl programming
Thang Nguyen
 
Tdd for BT E2E test community
Kerry Buckley
 
Enums In the Wild at PHP[tek] Conference 2025
Dana Luther
 
Testing With Test::Class
Curtis Poe
 
Perl Bag of Tricks - Baltimore Perl mongers
brian d foy
 
Practical approach to perl day1
Rakesh Mukundan
 
TDD with PhpSpec
CiaranMcNulty
 
Ad

Recently uploaded (20)

PDF
Python basic programing language for automation
DanialHabibi2
 
PDF
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PPTX
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
Python basic programing language for automation
DanialHabibi2
 
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
Ad

Perl Test::Spec in 5 minutes

  • 1. 5 minutes intro into Test::Spec BDD testing system for Perl
  • 2. use Test::Spec; describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; };
  • 3. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Standing on the shoulders of giants. Test::Builder,Test::More, ...
  • 4. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Behavior-Driven Development
  • 5. sub fooadd : Tests { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); is( $calculator->add('//;n1,1'), 2); eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); } vs Test::Class
  • 6. sub add : Tests { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); } sub custom_delimiters : Tests { is( $calculator->add('//;n1,1'), 2); } sub holidays : Tests { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); } vs Test::Class
  • 7. sub add_supports_simple_calculations_on_regular_day : Tests { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); } sub add_supports_custom_delimiters_on_regular_day : Tests { is( $calculator->add('//;n1,1'), 2); } sub add_throws_exception_on_holidays : Tests { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); } vs Test::Class
  • 8. sub add_returns_zero_for_empty_input_on_regular_day : Tests { is( $calculator->add(''), 0); } sub add_returns_given_number_for_single_number_input_on_regular_day : Tests { is( $calculator->add('1'), 1); } sub add_returns_sum_of_comma_delimited_numbers_on_regular_day : Tests { is( $calculator->add('1,1'), 2); } sub add_throws_exception_for_any_given_input_on_holidays : Tests { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); } vs Test::Class
  • 9. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Behavior-Driven Development
  • 10. StringCalculator on regular day supports basic calculations supports custom delimiters on holidays throws exception for any input
  • 11. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Easy mocks/stubs
  • 12. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => () ); }; describe "on regular day" => sub { before each => sub { Calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { Calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Easy mocks/stubs
  • 13. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Multiple before/after blocks
  • 14. describe "StringCalculator" => sub { my $calculator; my $calendar; before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); }; xdescribe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) }; it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); }; it "supports custom delimiters" => sub { is( $calculator->add('//;n1,1'), 2); }; }; describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) }; xit "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; }; }; Shortcuts