• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Unittesting Bad-Practices by Example
 

Unittesting Bad-Practices by Example

on

  • 2,112 views

So you are thinking of unit-testing the applications you work on a daily basis or already started to do so? Congratulations, but the really hard part is maintaining your test quality on such a high ...

So you are thinking of unit-testing the applications you work on a daily basis or already started to do so? Congratulations, but the really hard part is maintaining your test quality on such a high level so that you don't give up on testing down the road. In this talk I discuss unit-testing bad practices and test-smells, how to avoid them and show examples from open-source projects.

Statistics

Views

Total Views
2,112
Views on SlideShare
2,105
Embed Views
7

Actions

Likes
1
Downloads
28
Comments
0

2 Embeds 7

http://www.slideshare.net 5
http://10.150.200.76 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Unittesting Bad-Practices by Example Unittesting Bad-Practices by Example Presentation Transcript

    • Unit-Testing Bad-Practices by Example Benjamin Eberlei direkt effekt GmbH IPC 09, Karlsruhe Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 1 / 47
    • About Me Benjamin Eberlei direkt effekt GmBH (digital marketing) Open Source contributor (Zend Framework and Doctrine 2) Twitter @beberlei Blog: www.whitewashing.de Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 2 / 47
    • And You? Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 3 / 47
    • Why Test Quality Matters Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 4 / 47
    • “We spent 90% of the time modifying existing tests to acommodate for a relatively minor change.“ (G. Meszaros, xUnit Test Patterns) Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 5 / 47
    • Safety Net vs Dead Weight Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 6 / 47
    • Test Smells “Smell you later!” (Nelson, The Simpsons) Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 7 / 47
    • Code Duplication Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 8 / 47
    • ZF Controller Action public function testInitView () { Zen d_ C o n t r o l l e r _ Front :: getInstance () -> s e t C o n t r o l l er Dir ec to ry ( ’/ _files ’) ; require_once ’/ _files / ViewController . php ’; $controller = new ViewController ( new Z e n d _ C o n t r o l l e r _ R e q u e s t _ H t t p () , new Z e n d _ C o n t r o l l e r _ R e s p o n s e _ C l i () ); $view = $controller - > initView () ; $this - > assertTrue ( $view instanceof Zend_View ) ; $scriptPath = $view - > getScriptPaths () ; $this - > assertTrue ( is_array ( $scriptPath ) ) ; $this - > assertEquals ( ’/ views / scripts / ’ , $scriptPath [0]) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 9 / 47
    • ZF Controller Action 2 public function testRenderByName () { $request = new Z e n d _ C o n t r o l l e r _ R e q u e s t _ H t t p () ; $request - > set ControllerName ( ’ view ’) -> setActionName ( ’ test ’) ; $response = new Z e n d _ C o n t r o l l e r _ R e s p o n s e _ C l i () ; Zen d_ C o n t r o l l e r _ Front :: getInstance () -> s e t C o n t r o l l er Dir ec to ry ( ’/ _files ’) ; require_once ’/ _files / ViewController . php ’; $controller = new ViewController ( $request , $response ) ; $controller - > testAction () ; $this - > assertContains ( ’ In the index action view ’ , $response - > getBody () ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 10 / 47
    • ZF Controller Refactoring Extract Test Utility Method: public function c r e ateViewController ( $controllerName = null , $actionName = null ) { $request = new Z e n d _ C o n t r o l l e r _ R e q u e s t _ H t t p () ; if ( $controllerName !== null ) { $request - > setControllerName ( $controllerName ) ; } if ( $actionName !== null ) { $request - > setActionName ( $actionName ) ; } $response = new Z e n d _ C o n t r o l l e r _ R e s p o n s e _ C l i () ; Zen d_ C o n t r o l l e r _ Front :: getInstance () -> s e t C o n t r o l le rD ire ct or y ( ’/ _files ’) ; require_once ’/ _files / ViewController . php ’; return new ViewController ( $request , $response ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 11 / 47
    • ZF Controller Refactoring 2 public function t e s tI nit Vi ew Ref ac to red () { // fixture setup $controller = $this - > createViewController () ; // execution $view = $controller - > initView () ; $scriptPath = $view - > getScriptPaths () ; // assertions $this - > assertTrue ( $view instanceof Zend_View ) ; $this - > assertTrue ( is_array ( $scriptPath ) ) ; $this - > assertEquals ( ’/ views / scripts / ’ , $scriptPath [0] ); } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 12 / 47
    • ZF Controller Refactoring 3 public function t e s t R e n d e r B y N a m e R e f a c t o r e d () { // fixture setup $controller = $this - > c r e a teViewController ( ’ view ’ , ’ test ’) ; // execution $controller - > testAction () ; // assertions $this - > assertContains ( ’ In the index action view ’ , $response - > getBody () ); } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 13 / 47
    • Assertion Roulette Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 14 / 47
    • Doctrine ResultSetMapping public function t e s t B a s i c Re s u l t S e t M a p p i n g () { // Fixture Setup $rsm = new ResultSetMapping () ; $rsm - > addEntityResult ( ’ Doctrine Tests Models CMS CmsUser ’ , ’u ’ ); $rsm - > addFieldResult ( ’u ’ , ’ id ’ , ’ id ’) ; $rsm - > addFieldResult ( ’u ’ , ’ status ’ , ’ status ’) ; $rsm - > addFieldResult ( ’u ’ , ’ user ’ , ’ user ’) ; $rsm - > addFieldResult ( ’u ’ , ’ name ’ , ’ name ’) ; // [..] } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 15 / 47
    • Doctrine ResultSetMapping 2 public function t e s t B a s i c Re s u l t S e t M a p p i n g () { // [..] $this - > assertFalse ( $rsm - > isScalarResult ( ’ id ’) ) ; $this - > assertFalse ( $rsm - > isScalarResult ( ’ status ’) ) ; $this - > assertFalse ( $rsm - > isScalarResult ( ’ user ’) ) ; $this - > assertFalse ( $rsm - > isScalarResult ( ’ name ’) ) ; $this - > assertTrue ( $rsm - > getClass ( ’u ’) == ’ Doctrine Tests Models CMS CmsUser ’ ); $class = $rsm - > getOwningClass ( ’ id ’) ; $this - > assertTrue ( $class == ’ Doctrine Tests Models CMS CmsUser ’ ); } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 16 / 47
    • Doctrine ResultSetMapping 3 public function t e s t B a s i c Re s u l t S e t M a p p i n g () { // [..] $this - > assertEquals ( ’u ’ , $rsm - > getAlias ( ’ id ’) ) ; $this - > assertEquals ( ’u ’ , $rsm - > getAlias ( ’ status ’) ) ; $this - > assertEquals ( ’u ’ , $rsm - > getAlias ( ’ user ’) ) ; $this - > assertEquals ( ’u ’ , $rsm - > getAlias ( ’ name ’) ) ; $this - > assertEquals ( ’ id ’ , $rsm - > getField ( ’ id ’) ) ; $this - > assertEquals ( ’ status ’ , $rsm - > getField ( ’ status ’) ) ; $this - > assertEquals ( ’ username ’ , $rsm - > getField ( ’ user ’) ) ; $this - > assertEquals ( ’ name ’ , $rsm - > getField ( ’ name ’) ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 17 / 47
    • Eager Test Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 18 / 47
    • ezcUrl Test public function t e s t R e m o v e O r d e r e d P a r a m e t e r () { $urlCfg = new e zcUrlConfiguration () ; $urlCfg - > a d dO r d eredParameter ( ’ section ’ ) ; $urlCfg - > a d dO r d eredParameter ( ’ module ’ ) ; $urlCfg - > a d dO r d eredParameter ( ’ view ’ ) ; $u = ’ http :// www . example . com / doc / components ’; $url = new ezcUrl ( $u , $urlCfg ) ; // [..] } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 19 / 47
    • ezcUrl Test 2 public function t e s t R e m o v e O r d e r e d P a r a m e t e r () { // [..] // functionality tested in other tests before $this - > assertEquals ( array ( ’ section ’ = > 0 , ’ module ’ = > 1 , ’ view ’ = > 2) , $url - > configuration - > orderedParameters ); $this - > assertEquals ( ’ doc ’ , $url - > getParam ( ’ section ’) ) ; $this - > assertEquals ( ’ components ’ , $url - > getParam ( ’ module ’) ); // [..] } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 20 / 47
    • ezcUrl Test 3 public function t e s t R e m o v e O r d e r e d P a r a m e t e r () { // [..] // Primary Assertion according to test method name $url - > configuration - > r em ove Or de re dPa ra me ter ( ’ view ’) ; $this - > assertEquals ( array ( ’ section ’ = > 0 , ’ module ’ = > 1 ) , $url - > configuration - > orderedParameters ); // [..]? } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 21 / 47
    • ezcUrl Test 4 public function t e s t R e m o v e O r d e r e d P a r a m e t e r () { // [..] try { $this - > assertEquals ( null , $url - > getParam ( ’ view ’) ) ; $this - > fail ( ’ Expected exception was not thrown . ’) ; } catch ( e z c U r l I n v a l i d P a r a m e t e r E x c e p t i o n $e ) { $expected = " ... " ; $this - > assertEquals ( $expected , $e - > getMessage () ) ; } // [..]? } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 22 / 47
    • ezcUrl Test 5 public function t e s t R e m o v e O r d e r e d P a r a m e t e r () { // [..] // try removing again - nothing bad should happen $url - > configuration - > r em ove Or de re dPa ra me ter ( ’ view ’) ; try { $this - > assertEquals ( null , $url - > getParam ( ’ view ’) ) ; $this - > fail ( ’ Expected exception was not thrown . ’) ; } catch ( e z c U r l I n v a l i d P a r a m e t e r E x c e p t i o n $e ) { $expected = " ... " ; $this - > assertEquals ( $expected , $e - > getMessage () ) ; } } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 23 / 47
    • Fragile Test Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 24 / 47
    • Zend SOAP Wsdl Test function testAddBinding () { $wsdl = new Zend_Soap_Wsdl ( ’ MyService ’ , ’ http :// localhost / MyService . php ’) ; $wsdl - > addPortType ( ’ myPortType ’) ; $wsdl - > addBinding ( ’ MyServiceBinding ’ , ’ myPortType ’) ; $this - > assertEquals ( $wsdl - > toXml () ) , ’ <? xml version ="1.0"? > ’ . ’ < definitions xmlns =" http :// schemas . xmlsoap . org / wsdl /" ’ . ’ xmlns : tns =" http :// localhost / MyService . php " ’ . ’ xmlns : soap =" http :// schemas . xmlsoap . org / wsdl / soap /" ’ . ’ xmlns : xsd =" http :// www . w3 . org /2001/ XMLSchema " ’ . ’ xmlns : soap - enc =" http :// schemas . xmlsoap . org / soap / encoding /" ’ . ’ xmlns : wsdl =" http :// schemas . xmlsoap . org / wsdl /" ’ . ’ name =" MyService " targetNamespace =" http :// localhost / MyService . php " > ’ . ’ < portType name =" myPortType "/ > ’ . ’ < binding name =" MyServiceBinding " type =" myPortType "/ > ’ . ’ </ definitions > ’ ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 25 / 47
    • Obscure Tests Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 26 / 47
    • Global State: Zend Framework // Z e n d _ C o n t r o l l e r _ A c t i o n _ H e l p e r _ V i e w R e n d e r e r T e s t protected function setUp () { $this - > request = new Z e n d _ C o n t r o l l e r _ R e q u e s t _ H t t p () ; $this - > response = new Z e n d _ C o n t r o l l e r _ R e s p o n s e _ H t t p () ; $this - > front = Ze nd_C ontro ller _Fron t :: getInstance () ; $this - > front - > resetInstance () ; $this - > front - > a ddModuleDirectory ( ’/ _files / modules ’) -> setRequest ( $this - > request ) -> setResponse ( $this - > response ) ; $this - > helper = new Z e n d _ C o n t r o l l e r _ A c t i o n _ H e l p e r _ V i e w R e n d e r e r () ; Z e n d _ C o n t r o l l e r _ A c t i o n _ H e l p e r B r o k e r :: addHelper ( $this - > helper ); } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 27 / 47
    • Indirect Tests: ezcMvc function t e s t I n t e r n alRedirect () { $config = new s impleConfiguration () ; $config - > route = ’ IRController ’; $dispatcher = new e z c M v c C o n f i g u r a b l e D i s p a t c h e r ( $config ) ; $dispatcher - > run () ; self :: assertEquals ( " BODY : Name : name , " . " Vars : array ([ CR ] ’ nonRedirVar ’ = > 4 , " . " [ CR ] ’ ReqRedirVar ’ = > 4 ,[ CR ]) " , $config - > store ) ; } function t e s t E x t e r n alRedirect () { $config = new s impleConfiguration () ; $config - > route = ’ IRController ’; $dispatcher = new e z c M v c C o n f i g u r a b l e D i s p a t c h e r ( $config ) ; $dispatcher - > run () ; self :: assertEquals ( " BODY : Name : name , " . " Vars : array ([ CR ] ’ nonRedirVar ’ = > 4 , " . " [ CR ] ’ ReqRedirVar ’ = > 4 ,[ CR ]) " , $config - > store ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 28 / 47
    • Test-Names: FLOW3 MVC dispatchCallsTheControllersProcess RequestMethodUntilTheIsDispatchedFlag InTheRequestObjectIsSet() dispatchThrowsAnInfiniteLoopException IfTheRequestCouldNotBeDispached After99Iterations() resolveControllerReturnsTheNotFound ControllerDefinedInTheFLOW3Settings AndInjectsCorrectException IfTheResolvedControllerDoesNotExist() Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 29 / 47
    • Test-Names: eZ Workflow testProperties() Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 30 / 47
    • Test-Names: eZ Workflow testProperties() testProperties2() testProperties3() testProperties4() testProperties5() testProperties6() testProperties7() Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 30 / 47
    • Slow Tests Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 31 / 47
    • Zend Service Amazon public function setUp () { $this - > _amazon = new Zend_Service_Amazon () ; $this - > _query = new Z e n d _ S e r v i ce _ A m a z o n _ Q u e r y () $this - > _httpClient = new Z e n d _ H t t p _ C l i e n t _ A d a p t e r _ S o c k e t () ; $this - > _amazon - > getRestClient () -> getHttpClient () -> setAdapter ( $this - > _httpClient ) ; // terms of use compliance : // no more than one query per second sleep (1) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 32 / 47
    • Zend Service Amazon 2 public function t e s t I t e m S ea r c h M u s i c M o z a r t () { $resultSet = $this - > _amazon - > itemSearch ( array ( ’ SearchIndex ’ = > ’ Music ’ , ’ Keywords ’ = > ’ Mozart ’ , ’ ResponseGroup ’ = > ’ Small , Tracks , Offers ’ )); foreach ( $resultSet as $item ) { $this - > assertTrue ( $item instanceof Z e n d_ S e r vi c e _ Am a z o n_ I t e m ); } } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 33 / 47
    • Zend Amazon Refactored public function setUpRefactored () { $this - > _amazon = new Zend_Service_Amazon () ; $this - > _httpClient = new Z e n d _ H t t p _ C l i e n t _ A d a p t e r _ T e s t () ; $this - > _amazon - > getRestClient () -> getHttpClient () -> setAdapter ( $this - > _httpClient ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 34 / 47
    • Zend Amazon Refactored 2 public function t e s t I t e m S e a r c h M u s i c M o z a r t R e f a c t o r e d () { $this - > _httpClient - > setResponse ( fil e_get_ contents ( " ExpectedTestResponse . txt " ) ); $resultSet = $this - > _amazon - > itemSearch ( array ( ’ SearchIndex ’ = > ’ Music ’ , ’ Keywords ’ = > ’ Mozart ’ , ’ ResponseGroup ’ = > ’ Small , Tracks , Offers ’ )); foreach ( $resultSet as $item ) { $this - > assertTrue ( $item instanceof Z e n d_ S e r vi c e _ Am a z o n_ I t e m ); // Assert some relevant stuff now ! } } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 35 / 47
    • Conditional Logic “Everyone knows that debugging is twice as hard as writing a program in the first place. So if you’re as clever as you can be when you write it, how will you ever debug it?” (Brian Kernighan) Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 36 / 47
    • FLOW3 Cache Frontend public function t h e C o n s t r u c t o r A c c e p t s V a l i d I d e n t i f i e r s () { $mockBackend = $this - > createMockBackend () ; $identifiers = array ( ’x ’ , ’ someValue ’ , ’ 123 fivesixseveneight ’ , ’ some & ’ , ’ ab_cd % ’ , rawurlencode ( ’ package :// some / $ &% sadf ’) , str_repeat ( ’x ’ , 250) ); foreach ( $identifiers as $identifier ) { $abstractCache = $this - > getMock ( ’ F3 FLOW3 Cache Frontend StringFrontend ’ , array () , array ( $identifier , $mockBackend ) ); } } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 37 / 47
    • FLOW3 Cache Refactored /* * * @dataProvider d a t a A c c e p t V a l i d I d e n t i f ie r */ public function c o n s t r u c t o r A c c e p t s V a l i d I d e n t i f i e r ( $id ) { $mockBackend = $this - > createMockBackend () ; $abstractCache = $this - > getMock ( ’ F3 FLOW3 Cache Frontend StringFrontend ’ , array () , array ( $id , $mockBackend ) ); } static public function d a t a A c c e p tV a l i d I d e n t i f i e r () { return array ( array ( ’x ’) , array ( ’ someValue ’) , array ( ’ 123 fivesixseveneight ’) , array ( ’ some & ’) , array ( ’ ab_cd % ’) , array ( rawurlencode ( ’ package :// some / $ &% sadf ’) ), array ( str_repeat ( ’x ’ , 250) ) ); } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 38 / 47
    • Zend Server ReflectionClass public function testGetMethods () { $r = new Z e n d _ S e r v e r _ R e f l e c t i o n _ C l a s s ( new ReflectionClass ( ’ Ze nd_ Se rv er_ Re fl ect io n ’) ); $methods = $r - > getMethods () ; $this - > assertTrue ( is_array ( $methods ) ) ; foreach ( $methods as $m ) { $this - > assertTrue ( $m instanceof Z e n d _ S e r v e r _ R e f l e c t i o n _ M e t h o d ); } } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 39 / 47
    • A working implementation class Z e n d _ S e r v e r _ R e f l e c t i o n _ C l a s s { public function getMethods () { return array () ; } } Great, all tests pass! Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 40 / 47
    • Zend Server ReflectionClass Test Refactoring public function t e s t G e tM e t ho d s R ef a c t or e d () { $r = new Z e n d _ S e r v e r _ R e f l e c t i o n _ C l a s s ( new ReflectionClass ( ’ Ze nd_ Se rv er_ Re fl ect io n ’) ); $methods = $r - > getMethods () ; $this - > assertTrue ( is_array ( $methods ) ) ; $this - > assertEquals (3 , count ( $methods ) ) ; // (!!) foreach ( $methods as $m ) { $this - > assertTrue ( $m instanceof Z e n d _ S e r v e r _ R e f l e c t i o n _ M e t h o d ); } } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 41 / 47
    • Zend Server ReflectionClass Test Refactoring 2 public function ass ertReflMethods ( $methods , $expected ) { $this - > assertTye ( ’ array ’ , $methods ) ; $this - > assertEquals ( $expected , count ( $methods ) ) ; foreach ( $methods as $m ) { $this - > assertTrue ( $m instanceof Z e n d _ S e r v e r _ R e f l e c t i o n _ M e t h o d ); } } public function t e s t G e tM e t ho d s R ef a c t or e d () { $r = new Z e n d _ S e r v e r _ R e f l e c t i o n _ C l a s s ( new ReflectionClass ( ’ Ze nd_ Se rv er_ Re fl ect io n ’) ); $this - > as sertRe flMethods ( $r - > getMethods () , 3) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 42 / 47
    • Mock-Overkill Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 43 / 47
    • FLOW3 MVC Dispatcher public function testDispatch () { $mockRequest = $this - > getMock ( ’ F3 FLOW3 MVC RequestInterface ’) ; $mockRequest - > expects ( $this - > at (0) ) -> method ( ’ isDispatched ’) -> will ( $this - > returnValue ( FALSE ) ) ; $mockRequest - > expects ( $this - > at (1) ) -> method ( ’ isDispatched ’) -> will ( $this - > returnValue ( FALSE ) ) ; $mockRequest - > expects ( $this - > at (2) ) -> method ( ’ isDispatched ’) -> will ( $this - > returnValue ( TRUE ) ) ; $mockResponse = $this - > getMock ( ’ F3 FLOW3 MVC ResponseInterface ’ ); // [..] } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 44 / 47
    • FLOW3 MVC Dispatcher 2 public function testDispatch () { // [..] $mockController = $this - > getMock ( ’ F3 FLOW3 MVC Controller ControllerInterface ’ , array ( ’ processRequest ’ , ’ canProcessRequest ’) ); $mockController - > expects ( $this - > exactly (2) ) -> method ( ’ processRequest ’) -> with ( $mockRequest , $mockResponse ) ; $dispatcher = $this - > getMock ( ’ F3 FLOW3 MVC Dispatcher ’ , array ( ’ reso lveController ’) , array () , ’ ’ , FALSE ); $dispatcher - > expects ( $this - > any () ) -> method ( ’ resolveController ’) -> will ( $this - > returnValue ( $mockController ) ) ; $dispatcher - > dispatch ( $mockRequest , $mockResponse ) ; } Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 45 / 47
    • Further Readings xUnit Test Patterns Book by Gerald Meszaros, http://xunitpatterns.com/Test%20Smells.html TDD Anti Patterns http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/ Misko Hevery’s Blog http://misko.hevery.com/ Google Testing Blog http://googletesting.blogspot.com/ Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 46 / 47
    • Thank You! E-Mail: kontakt@beberlei.de Twitter: beberlei Blog: http://www.whitewashing.de Eberlei (direkt effekt GmbH) Unit-Testing Bad-Practices IPC 09, Karlsruhe 47 / 47