Menulis ScalaTest untuk ReactiveMongoApi di Playframework 2.4?

Saya mencoba untuk mulai menulis tes untuk mongodb di aplikasi bermain saya.

Tampaknya saya tidak dapat menjalankannya karena koneksi dimatikan sebelum penyimpanan dijalankan.

Inilah hasilnya

[info] UserDaoMongoSpec:
[info] UserDao
[info] - application - ReactiveMongoApi starting...
[info] - application - ReactiveMongoApi successfully started with DB 'test'! Servers:
            [localhost:27017]
[info] - should save users and find them by userId
[info] - application - ReactiveMongoApi stopping...
[info] - application - ReactiveMongoApi connections stopped. [Success(Closed)]
[INFO] [12/24/2015 15:36:43.961] [reactivemongo-akka.actor.default-dispatcher-4] [akka://reactivemongo/user/Monitor-3] Message [reactivemongo.core.actors.Close$] from Actor[akka://reactivemongo/deadLetters] to Actor[akka://reactivemongo/user/Monitor-3#1192398481] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[info] ScalaTest
[info] Run completed in 3 seconds, 989 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1

Ini adalah kode pengujiannya, yang tidak menguji apa pun, tetapi saya mencoba menulis databasenya terlebih dahulu.

package test.daos

import scala.concurrent.ExecutionContext.Implicits.global

import daos.impl.UserDaoMongo

import org.scalatest._
import play.api.test._
import play.api.test.Helpers._
import org.scalatestplus.play._

class UserDaoMongoSpec extends DaosApplicationSpecOneAppPerTest {

  "UserDao" should {
    "save users and find them by userId" in {
      val userDao = new UserDaoMongo
      val future = for {
        _ <- userDao.save(credentialsTestUser)
        maybeUser <- userDao.find(credentialsTestUser.id)
      } yield maybeUser.map(_ == credentialsTestUser)
    }
  }

}

Dan implementasi dao

package daos.impl

import java.util.UUID

import scala.concurrent.Future

import play.api.Play.current
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.libs.json.Json

import play.modules.reactivemongo.ReactiveMongoApi
import play.modules.reactivemongo.json._
import play.modules.reactivemongo.json.collection.JSONCollection

import com.mohiva.play.silhouette.api.LoginInfo

import models.{User, Profile}
import models.User._

import daos.api.UserDao

import play.api.Logger

class UserDaoMongo extends UserDao {
  lazy val reactiveMongoApi = current.injector.instanceOf[ReactiveMongoApi]
  val users = reactiveMongoApi.db.collection[JSONCollection]("users")

  def find(loginInfo:LoginInfo):Future[Option[User]] =
    users.find(Json.obj("profiles.loginInfo" -> loginInfo)).one[User]

  def find(userId:UUID):Future[Option[User]] ={
    Logger.debug("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
    users.find(Json.obj("id" -> userId)).one[User]
  }

  def save(user:User):Future[User] =
    users.insert(user).map(_ => user)

  def confirm(loginInfo:LoginInfo):Future[User] = for {
    _ <- users.update(Json.obj(
      "profiles.loginInfo" -> loginInfo
    ), Json.obj("$set" -> Json.obj("profiles.$.confirmed" -> true)))
    user <- find(loginInfo)
  } yield user.get

  def link(user:User, profile:Profile) = for {
    _ <- users.update(Json.obj(
      "id" -> user.id
    ), Json.obj("$push" -> Json.obj("profiles" -> profile)))
    user <- find(user.id)
  } yield user.get

  def update(profile:Profile) = for {
    _ <- users.update(Json.obj(
      "profiles.loginInfo" -> profile.loginInfo
    ), Json.obj("$set" -> Json.obj("profiles.$" -> profile)))
    user <- find(profile.loginInfo)
  } yield user.get
}

Apa yang mungkin saya lakukan salah?

Terima kasih


person agusgambina    schedule 24.12.2015    source sumber
comment
Anda perlu menunjukkan kode mana yang menimbulkan masalah.   -  person cchantep    schedule 25.12.2015
comment
Terima kasih @cchantep atas jawaban cepat Anda.   -  person agusgambina    schedule 25.12.2015
comment
Anda tidak menunggu Futures yang mungkin (tampaknya) selesai setelah pengujian dijalankan. Entah Anda menggunakan beberapa fungsi khusus skalatest untuk melakukan pengujian menunggu penyelesaian di masa mendatang, atau Anda Await.result sendiri.   -  person cchantep    schedule 25.12.2015
comment
@cchantep terima kasih. Ternyata Anda benar. Saya membuatnya berfungsi dengan Await.result. silakan posting sebagai jawabannya dan saya tandai sebagai jawaban yang benar.   -  person agusgambina    schedule 25.12.2015
comment
BTW itu juga bekerja dengan fungsi spesifik skalatest ketika Siap, tapi saya harus mengubah pengaturan batas waktu default.   -  person agusgambina    schedule 25.12.2015


Jawaban (1)


Seperti yang tertulis di kolom komentar, ternyata kesalahannya adalah saya tidak menunggu penyelesaian di kemudian hari. Saya memutuskan untuk menggunakan fungsi khusus ScalaTest untuk membuat pengujian menunggu penyelesaian di masa mendatang

Ini kodenya

"UserDao" should {

  "save users and find them by userId" in withUserDao { userDao =>
    val future = for {
      user <- userDao.save(credentialsTestUser)
      maybeUser <- userDao.find(credentialsTestUser.id)
    } yield {
      maybeUser.map(_ == credentialsTestUser)
    }
    whenReady (future) { result =>
      result.get must be (true)
    }
  }
}

dan untuk berjaga-jaga, saya mengganti perilaku default karena waktu default tidak cukup

implicit override val patienceConfig =
  PatienceConfig(timeout = Span(2, Seconds), interval = Span(5, Millis))

Terima kasih

person agusgambina    schedule 27.12.2015