8

テスト中にモック オブジェクトを提供して Play アプリケーションをテストしたいと考えています。私の頭の上から、これを行うにはいくつかの方法があります。

  1. テスト中に代替ルート ファイルを提供する
  2. 依存性注入を使用し、実行時にグローバル値を確認します

どちらがより実現可能か、またはそれらをどのように実行するかはわかりません。どんな洞察も大歓迎です。

4

4 に答える 4

13

3 番目の方法があります。テスト用のクラスまたはトレイトとしてコントローラーを作成します。簡単な例を次に示します。

あなたの特性 + 実装:

package services

trait MyService {
  def getUser(id:String):User
}

class ConcreteService extends MyService {
  override def getUser(id:String):User = {
  //Do real stuff
  }
}

あなたのコントローラークラスで:

package controllers

import services._

class Users(service: MyService) extends Controller {
  def show(id: String) = Action {
    val user = service.getUser(id)
    Ok(views.html.user(user))
  }
}

object Users extends controllers.Users(new ConcreteService()) {}

これで、いくつかの単体テストを実行できます..

package test

import controllers.Users
import play.api.test._
import play.api.test.Helpers._

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

class UsersSpec extends Specification with Mockito {
  val service = mock[MyService]

  "Users controller" should {
    "list users" in {
      //Insert mocking stuff here

      val users = new Users(service)
      val result = users.show("somerandomid")(FakeRequest())
      status(result) must equalTo(OK)
    }
  }
}
于 2012-04-11T22:03:32.467 に答える
6

私は同じ質問をして、いくつかのオプションを試しました:

  • ケーキパターン
  • 暗黙的な注入
  • バネ

コードは github here で見ることができます。

于 2012-12-03T13:38:48.150 に答える
2

参考までに、テスト中にモック オブジェクトを注入するために Play のプラグイン フレームワークを使用する例を追加しました。

  1. http://www.underflow.ca/blog/935/mock-dependency-injection-in-play-2-0

このメソッドを使用すると、モック化されたプラグインをテスト時に提供できます。

class Test extends Specification {
    "application" should {
        "load mock dependency" in {
            running(TestServer(9000, FakeApplication(

            // The plugin at this class replaces the default
            additionalPlugins = Seq("test.MockInjector")

            )), HTMLUNIT) { browser =>
                browser.goTo("http://localhost:9000")

                // Test mock controller

            }
        }
    }
}

MockInjectorを使用して、コントローラー オブジェクトまたはその他の注入可能なコンポーネントを提供できます。

: このブログ エントリは私が書いたもので、誰でも自由にブログからすべてのコンテンツをここに移行できます。

于 2012-04-25T09:22:05.727 に答える