テスト中にモック オブジェクトを提供して Play アプリケーションをテストしたいと考えています。私の頭の上から、これを行うにはいくつかの方法があります。
- テスト中に代替ルート ファイルを提供する
- 依存性注入を使用し、実行時にグローバル値を確認します
どちらがより実現可能か、またはそれらをどのように実行するかはわかりません。どんな洞察も大歓迎です。
テスト中にモック オブジェクトを提供して Play アプリケーションをテストしたいと考えています。私の頭の上から、これを行うにはいくつかの方法があります。
どちらがより実現可能か、またはそれらをどのように実行するかはわかりません。どんな洞察も大歓迎です。
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)
}
}
}
参考までに、テスト中にモック オブジェクトを注入するために Play のプラグイン フレームワークを使用する例を追加しました。
このメソッドを使用すると、モック化されたプラグインをテスト時に提供できます。
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
を使用して、コントローラー オブジェクトまたはその他の注入可能なコンポーネントを提供できます。
注: このブログ エントリは私が書いたもので、誰でも自由にブログからすべてのコンテンツをここに移行できます。