2012-09-25 13 views
5

Ich habe ein Problem mit Spott in einer Play-Anwendung. Ich habe eine Anwendung wie folgt:Verspottung im Spiel! und 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") 
     } 
    } 
} 

Was ich tun möchte, ist eine Anforderung zu testen, aber die Emailchecker becasue es hat einige Lookup in irgendeiner Datenbank und das ist nicht etwas, was ich tun will, in meinem Test verspotten weg.

Ich habe einige Tutorials gesehen, wie man in Scala spotten kann, aber ich kann nichts finden, das den Fall abdeckt, den ich habe.

Jede Hilfe/Hinweise/Tutorials, die zeigen, wie zu tun, was ich tun möchte, wäre großartig.

Ich bin ziemlich neu in beiden Spielen! und Scala ...

Antwort

5

Eine mögliche Lösung:

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) 

Und der Test wäre:

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]") 
    } 
} 

Ich mag auch ein Objekt definieren die Real und Test implicits enthält, die die reale bieten und Stub-Versionen von Diensten wie EmailChecker und importieren sie je nachdem, ob es sich um einen Test- oder einen Produktcode handelt. In diesem Fall müssen Sie den Parameter emailChecker implizit angeben. Eine grobe Art der Abhängigkeitsinjektion.

+0

Das hat funktioniert. Vielen Dank. – Jakob

+0

Ich bin froh, es zu hören. Könnten Sie bitte die Antwort akzeptieren? (Shameless Point Chasing :)) – rjsvaljean

+0

Gibt es eine Chance, dass Sie die Behauptung auf die Antwort zu Ihrem Testbeispiel hinzufügen könnten? –