1

これは、FakeApplication でのプラグインの使用について誤解していたという以前の質問の続きです。

まず、トレイトとして作成されたモデルと、それを実装するオブジェクトがあります。

trait UserModel extends ModelCompanion[User, ObjectId] {
 // ...
}

object User extends UserModel

次に、UserModel のインスタンスを受け取る抽象クラスとして作成された Controller と、User オブジェクトを使用するそれぞれの実装があります。

abstract class UsersController extends Controller {

  val userModel: UserModel

  def sayHello = Action(parse.json) { request =>
    // return a play Action. It doesn't use userModel
  }


  // Other methods

}

object Users extends UsersController(User)

テスト ディレクトリで、UserModel モックを使用して UsersController スタブを作成しました。

package controllers

import org.specs2.mock.Mockito

object UserControllersTest extends UsersController with Mockito {
  val userModel = mock[models.UserModel]
}

これで、UsersControllers Spec テストができました。

package controllers

import org.specs2.mutable.Specification

import play.api.libs.json.Json
import play.api.test._
import play.api.test.Helpers._

class UsersSayHelloSpec extends Specification {

  running(FakeApplication()) {

    "Users.SayHello" should {

      def sendJson(jsonMap: Map[String, String], shouldBeCorrect: Boolean) = {
        running(new FakeApplication(
          additionalPlugins = Seq("controllers.UserControllersTest"))) {
          // Preapration 
          val jsonRequisition = Json.toJson(jsonMap)
          // ***************************************
          // It will call UsersControllers.sayHello
          val Some(result) = routeAndCall(FakeRequest(POST,
              "/hello",
              FakeHeaders(Map("Content-Type" -> Seq("application/json"))),
              jsonRequisition))
          // ***************************************


            // ...
        }
      }

      "Not process a empty String" in {
        sendJson(Map.empty[String, String], false)
      }

      // Other tests calling sendJson ...
    }

  }

}

だから私の質問は: routeAndCall() 呼び出しで「/hello」URL を呼び出すときに、実際の UserControllers 実装の代わりに UserControllersTest を使用するように FakeApplication にどのように言うことができますか?

4

1 に答える 1

0

アプリケーションには、テストしたい部分が 2 つあります。

  • コントローラー自体
  • http ルーター

コントローラー自体をテストするときは、通常、リクエストを作成し、それをコントローラー メソッドに直接渡します。これにより、応答が生成されます。次に、回答の検証を実行して、テスト結果を検証します。

ルーターをテストするとき、テストしたいのは、要求が正しいコントローラー メソッドにルーティングされることです。URL を直接呼び出して、期待したコントローラーからの結果が期待どおりであることを確認します。

あなたがやろうとしていることは、私にはあまり意味がありません:

ルート /hello にダミーコントローラーがある場合、ルート /hello への投稿は正しく機能しますか?

routes ファイルは、実際にルーターとして機能する Scala クラスにコンパイルされるため、そのような動的ルーティング機能が利用できる場合 (私にはわかりませんが)、次のことを行う必要があります。

  • /hello パスの既存のルートを削除します
  • 新しいルート ポイントを別のコントローラに追加する
于 2012-11-09T14:57:51.717 に答える