SlideShare a Scribd company logo
1 of 21
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Mocking objects practices for Symfony
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Nei prossimi 50 minuti...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> is_int (2147483647) + 1 = is_int(2147483648) True False Chi esegue delle verifiche (di qualsiasi tipo)  dopo aver scritto del codice?? ,[object Object],[object Object],[object Object],Fondamentale:  Il codice non è mai privo di errori!! Un esempio: Chi ha mai testato una funzione di somma?
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],Test-Driven Development Il TDD in un'immagine: Cosa devo fare? (Design) Implementazione Lancio il test Verificato Refactoring Fallito Scrittura Test(s)
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> I  test  deveno essere il  “più possibile” completi Rappresentano le nostre conoscenze (in quel momento) I  test  rappresentano  lo  stato del nostro lavoro Abbiamo introdotto errori? Niente test, niente commit. Il  refactoring  rende il  codice pulito ,  comprensibile  e  modificabile Spaghetti code, $pippo = $k + $i??? l l  Domain-driven Design  rende il  codice leggibile function PippoPlutoPaperino() VS function getAllButTopolino() Utilizzando il Test-Driven Development...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Centinaia, ...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Decine, ...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Unità.
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un test unitario specifica il  comportamento  di un metodo/una funzione o un'intera classe Un test unitario è necessariamente un test  isolato Un test unitario rende esplicite le  dipendenze  di un metodo/oggetto rispetto ad altri metodi/oggetti Un test unitario deve prevedere la verifica di  ogni  comportamento dell'unità che verifica (“black box” test VS “white box” test) “ L'unità” fa la forza
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Dipendenze ? Disaccoppiamento? Isolamento? Quando è difficile eseguire un test unitario
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Soluzioni per eseguire dei test in isolamento
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Mock & Stub   ref: Mock aren't Stubs <Martin Fowler> http://martinfowler.com/articles/mocksArentStubs.html
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Legacy system/code Gli strumenti con cui lavoro (framework) mi “impongono” la struttura del codice altri??... La decisione all'atto della progettazione non mi permette di applicare i pattern che prevedono mock e stub E quando non posso modificare il codice che verifico??
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Il database è spesso coinvolto E' permesso fare questo: require_once($sf_symfony_lib_dir.'/autoload/sfSimpleAutoload.class.php'); $autoload = new sfSimpleAutoload(); $autoload->addDirectory($sf_symfony_lib_dir.'/util'); $autoload->register(); E questo: new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration( 'frontend', 'test', true)); $loader = new sfPropelData(); $loader->loadData(sfConfig::get('sf_data_dir').'/fixtures'); Symfony e unit test
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Lime style: include(dirname(__FILE__).'/../bootstrap/unit.php'); require_once($sf_symfony_lib_dir.'/util/sfToolkit.class.php'); class myObject { public function myMethod(){} } $t = new lime_test(16, new lime_output_color()); $t->diag('isPathAbsolute()'); $t->is(sfToolkit::isPathAbsolute('/test'), true); $t->ok(sfToolkit::setObject(new myObject()) instanceof myObject); Symfony e unit test
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> sfPhpunitPlugin class RepositoryTest extends PHPUnit_Framework_TestCase{ public function testGetLogFromRepository() {   $proxy = $this->getMock('SvnProxy');   $xml_reader = $this->getMock('SvnXmlReader');   $logcommand = $this->getMock('SvnLogCommand');   $repository = new SVNRepository($proxy, $xml_reader);   $this->assertEquals('svn log -n 5', $repository->getRevisionsLog($mock_logcommand)); }  … } Symfony e unit test
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> idMockStubGenerator include('/Mock-Stub-Generator/FakeObjectGenerator.cless.php'); $rvm = new ReturnValuesManager('SvnLogCommand'); $rvm->setReturnValue('getSubCommandName', 'subCommandName ') ->setReturnValue('getOptionList', '--option value --option value '); FakeObjectGenerator::generate($rvm, new CodeGenerator()); $t = new lime_test(9, new lime_output_color()); $svn_proxy = new SvnProxy('file:///localrepository/newProject'); $svn_proxy->setSubCommand(new SvnLogCommand()); $t->is($svn_proxy->getCommand(),   'svn --config-dir subCommandName --option value --option value '); Symfony e unit test
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un esempio vale più di mille parole!
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Non utilizzando le classi reali, come faccio ad implementare uno unit test per la mia classe SvnRepository? Lime? PHPUnit? idMockStubGenerator? Sto sviluppando un “lettore” di log di un repository SVN remoto Ho bisogno di una classe per la lettura dei file XML. Ho bisogno di una classe per la gestione del comando SVN Ho bisogno di due classi per icomandi “log” e “diff” Ho bisogno di una classe che faccia da parser per i file diff Ho bisogno di una classe che descrive i dati ricavati dai log
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Come faccio a replicare le classi “Peer” generate da propel? Lime? PHPUnit? idMockStubGenerator? Sto sviluppando due classi “user” e “book” usando Symfony e propel Ho una classe utenti Ho una classe libri Voglio cercare un libro il cui titolo è uguale al mio nome
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Domande?

More Related Content

What's hot

Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Alberto Pasca
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)DotNetMarche
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in DelphiMarco Breveglieri
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 

What's hot (6)

Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
 
PHP Object Injection
PHP Object InjectionPHP Object Injection
PHP Object Injection
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 

Similar to Mocking Objects Practices

Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven DevelopmentEnnio Masi
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascriptPiero Bozzolo
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPresslucatume
 
Unit testing in Visual Studio 2013
Unit testing in Visual Studio 2013Unit testing in Visual Studio 2013
Unit testing in Visual Studio 2013DomusDotNet
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsCommit University
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Davide Cerbo
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Giancarlo Valente
 
Code Generation con i templates T4 in visual studio
Code Generation con i templates T4 in visual studioCode Generation con i templates T4 in visual studio
Code Generation con i templates T4 in visual studioMarco Parenzan
 
Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2Fabio Mora
 

Similar to Mocking Objects Practices (20)

Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven Development
 
Sinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.x
Sinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.xSinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.x
Sinfonia in Domino RE - Integrazione Symphony e Lotus Notes 8.x
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascript
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPress
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Unit testing in Visual Studio 2013
Unit testing in Visual Studio 2013Unit testing in Visual Studio 2013
Unit testing in Visual Studio 2013
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step Functions
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)
 
Code Generation con i templates T4 in visual studio
Code Generation con i templates T4 in visual studioCode Generation con i templates T4 in visual studio
Code Generation con i templates T4 in visual studio
 
Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
 
Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2
 

More from GrUSP

REST e Resource Oriented Architectures
REST e Resource Oriented ArchitecturesREST e Resource Oriented Architectures
REST e Resource Oriented ArchitecturesGrUSP
 
Drupal come framework di sviluppo
Drupal come framework di sviluppoDrupal come framework di sviluppo
Drupal come framework di sviluppoGrUSP
 
PayPal e PHP
PayPal e PHPPayPal e PHP
PayPal e PHPGrUSP
 
Zend Server
Zend ServerZend Server
Zend ServerGrUSP
 
Zend Dojo
Zend DojoZend Dojo
Zend DojoGrUSP
 
PHP & IBM i
PHP & IBM iPHP & IBM i
PHP & IBM iGrUSP
 
Programmazione Ad Eventi In Php
Programmazione Ad Eventi In PhpProgrammazione Ad Eventi In Php
Programmazione Ad Eventi In PhpGrUSP
 
Joomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatoriJoomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatoriGrUSP
 
Symfony 2.0
Symfony 2.0Symfony 2.0
Symfony 2.0GrUSP
 
Memi Beltrame Collaborative Design
Memi Beltrame Collaborative DesignMemi Beltrame Collaborative Design
Memi Beltrame Collaborative DesignGrUSP
 

More from GrUSP (10)

REST e Resource Oriented Architectures
REST e Resource Oriented ArchitecturesREST e Resource Oriented Architectures
REST e Resource Oriented Architectures
 
Drupal come framework di sviluppo
Drupal come framework di sviluppoDrupal come framework di sviluppo
Drupal come framework di sviluppo
 
PayPal e PHP
PayPal e PHPPayPal e PHP
PayPal e PHP
 
Zend Server
Zend ServerZend Server
Zend Server
 
Zend Dojo
Zend DojoZend Dojo
Zend Dojo
 
PHP & IBM i
PHP & IBM iPHP & IBM i
PHP & IBM i
 
Programmazione Ad Eventi In Php
Programmazione Ad Eventi In PhpProgrammazione Ad Eventi In Php
Programmazione Ad Eventi In Php
 
Joomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatoriJoomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatori
 
Symfony 2.0
Symfony 2.0Symfony 2.0
Symfony 2.0
 
Memi Beltrame Collaborative Design
Memi Beltrame Collaborative DesignMemi Beltrame Collaborative Design
Memi Beltrame Collaborative Design
 

Mocking Objects Practices

  • 1. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Mocking objects practices for Symfony
  • 2.
  • 3.
  • 4.
  • 5. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> I test deveno essere il “più possibile” completi Rappresentano le nostre conoscenze (in quel momento) I test rappresentano lo stato del nostro lavoro Abbiamo introdotto errori? Niente test, niente commit. Il refactoring rende il codice pulito , comprensibile e modificabile Spaghetti code, $pippo = $k + $i??? l l Domain-driven Design rende il codice leggibile function PippoPlutoPaperino() VS function getAllButTopolino() Utilizzando il Test-Driven Development...
  • 6.
  • 7.
  • 8.
  • 9. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un test unitario specifica il comportamento di un metodo/una funzione o un'intera classe Un test unitario è necessariamente un test isolato Un test unitario rende esplicite le dipendenze di un metodo/oggetto rispetto ad altri metodi/oggetti Un test unitario deve prevedere la verifica di ogni comportamento dell'unità che verifica (“black box” test VS “white box” test) “ L'unità” fa la forza
  • 10. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Dipendenze ? Disaccoppiamento? Isolamento? Quando è difficile eseguire un test unitario
  • 11.
  • 12.
  • 13. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Legacy system/code Gli strumenti con cui lavoro (framework) mi “impongono” la struttura del codice altri??... La decisione all'atto della progettazione non mi permette di applicare i pattern che prevedono mock e stub E quando non posso modificare il codice che verifico??
  • 14. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Il database è spesso coinvolto E' permesso fare questo: require_once($sf_symfony_lib_dir.'/autoload/sfSimpleAutoload.class.php'); $autoload = new sfSimpleAutoload(); $autoload->addDirectory($sf_symfony_lib_dir.'/util'); $autoload->register(); E questo: new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration( 'frontend', 'test', true)); $loader = new sfPropelData(); $loader->loadData(sfConfig::get('sf_data_dir').'/fixtures'); Symfony e unit test
  • 15. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Lime style: include(dirname(__FILE__).'/../bootstrap/unit.php'); require_once($sf_symfony_lib_dir.'/util/sfToolkit.class.php'); class myObject { public function myMethod(){} } $t = new lime_test(16, new lime_output_color()); $t->diag('isPathAbsolute()'); $t->is(sfToolkit::isPathAbsolute('/test'), true); $t->ok(sfToolkit::setObject(new myObject()) instanceof myObject); Symfony e unit test
  • 16. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> sfPhpunitPlugin class RepositoryTest extends PHPUnit_Framework_TestCase{ public function testGetLogFromRepository() { $proxy = $this->getMock('SvnProxy'); $xml_reader = $this->getMock('SvnXmlReader'); $logcommand = $this->getMock('SvnLogCommand'); $repository = new SVNRepository($proxy, $xml_reader); $this->assertEquals('svn log -n 5', $repository->getRevisionsLog($mock_logcommand)); } … } Symfony e unit test
  • 17. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> idMockStubGenerator include('/Mock-Stub-Generator/FakeObjectGenerator.cless.php'); $rvm = new ReturnValuesManager('SvnLogCommand'); $rvm->setReturnValue('getSubCommandName', 'subCommandName ') ->setReturnValue('getOptionList', '--option value --option value '); FakeObjectGenerator::generate($rvm, new CodeGenerator()); $t = new lime_test(9, new lime_output_color()); $svn_proxy = new SvnProxy('file:///localrepository/newProject'); $svn_proxy->setSubCommand(new SvnLogCommand()); $t->is($svn_proxy->getCommand(), 'svn --config-dir subCommandName --option value --option value '); Symfony e unit test
  • 18. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un esempio vale più di mille parole!
  • 19. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Non utilizzando le classi reali, come faccio ad implementare uno unit test per la mia classe SvnRepository? Lime? PHPUnit? idMockStubGenerator? Sto sviluppando un “lettore” di log di un repository SVN remoto Ho bisogno di una classe per la lettura dei file XML. Ho bisogno di una classe per la gestione del comando SVN Ho bisogno di due classi per icomandi “log” e “diff” Ho bisogno di una classe che faccia da parser per i file diff Ho bisogno di una classe che descrive i dati ricavati dai log
  • 20. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Come faccio a replicare le classi “Peer” generate da propel? Lime? PHPUnit? idMockStubGenerator? Sto sviluppando due classi “user” e “book” usando Symfony e propel Ho una classe utenti Ho una classe libri Voglio cercare un libro il cui titolo è uguale al mio nome
  • 21. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Domande?