2012-09-25 9 views
5

Ho un problema con il mocking in un'applicazione Play. Ho una domanda come segue:Mocking in Play! e Scala

object Application extends Controller { 
    def login = Action {implicit request => 
     val email = ... //Some email from the request 
     if(EmailChecker.checkEmail(email)) { 
      Ok("Email is checked and is fine") 
     } else { 
      Ok("Email is wrong") 
     } 
    } 
} 

Quello che voglio fare è quello di testare una richiesta, ma prendere in giro via l'EmailChecker ragione fosse perché fa qualche ricerca in qualche database e che non è qualcosa che voglio fare nel mio test.

Ho visto alcuni tutorial su come prendere in giro Scala ma non riesco a trovare nulla che copra il caso che ho.

Qualsiasi aiuto/puntatori/tutorial che mostrano come fare ciò che voglio fare sarebbe fantastico.

Sono abbastanza nuovo per entrambi i giochi! e Scala ...

risposta

5

Una possibile soluzione:

class Application(emailChecker: EmailChecker) extends Controller { 
    def login = Action {implicit request => 
     val email = ... //Some email from the request 
     if(emailChecker.checkEmail(email)) { 
      Ok("Email is checked and is fine") 
     } else { 
      Ok("Email is wrong") 
     } 
    } 
} 

object Application extends Application(EmailChecker) 

e il test potrebbe essere:

import org.specs2.Specification 
import org.specs2.mock.Mockito 

class ApplicationUnitSpec extends Specification with Mockito { def is = 
    "Test Application" ! { 
     val emailChecker = mock[EmailChecker] 
     val response = new Application(emailChecker).login(FakeRequest) 
     there was one(emailChecker).checkEmail("[email protected]") 
    } 
} 

mi piace anche per definire un oggetto contenente le impliciti reali e di test che forniscono il vero e stub versioni rispettivamente di servizi come EmailChecker e importarli a seconda che si tratti di un test o codice di prodotto. In questo caso è necessario rendere implicito il parametro emailChecker. Un tipo grezzo di iniezione di dipendenza.

+0

Questo ha funzionato. Grazie. – Jakob

+0

Felice di sentirlo. Potresti accettare la risposta allora per favore. (Inseguimento senza punto :)) – rjsvaljean

+0

C'è qualche possibilità che tu possa aggiungere l'asserzione sulla risposta all'esempio di prova? –