2012-09-25 13 views
5

Playアプリケーションでmockingに問題があります。私が何をしたいかPlayでのMocking! 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") 
     } 
    } 
} 

は要求をテストしたが、それは一部のデータベースでは、いくつかのルックアップを行いbecasue EmailCheckerを離れて嘲笑することであり、それは私が私のテストでやりたいものではありません。次のように私は、アプリケーションを持っています。

私はScalaの模擬方法に関するチュートリアルをいくつか見てきましたが、私の場合をカバーするものは何も見つかりません。

私がしたいことをする方法を示すヘルプ/ポインタ/チュートリアルはすばらしいでしょう。

私は両方のプレイにかなり新しいです!そしてScalaの...

答えて

5

一つの可能​​な解決策:

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) 

そして、テストは次のようになります。

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

私も本当の提供実とテスト暗黙を含むオブジェクトを定義したいですEmailCheckerのようなサービスのバージョンをそれぞれスタブし、テストコードかプロードコードかに応じてインポートします。この場合、emailCheckerパラメーターを暗黙的にする必要があります。原型の依存性注入。

+0

これは機能しました。ありがとう。 – Jakob

+0

それを聞いてうれしい。あなたは答えを受け入れてください。 (恥知らずのポイント追いかけ:)) – rjsvaljean

+0

あなたのテスト例への応答にアサーションを追加する可能性はありますか? –