在学习游戏框架的同时尝试做一些TDD:
class ContentFetching extends PlaySpec with BeforeAndAfter with MockFactory
{
private val service = ContentService
private val languages = List(Language(Some(1), "en", "English", "Placeholder"),
Language(Some(2), "de", "Deutsch", "Platzhalter")
)
"find" must
{
"fail if languageCode is invalid" in
{
val fakeRepository = mock[LanguageRepositoryTrait]
(fakeRepository.get _).expects().returning(languages)
fakeRepository.get must have length 3
service.find("fr") must be Result.NotFound
}
}
}ContentService会调用:
def fourOhFour() = NotFound(s"Oops, content could not be found")然而,断言service.find("fr") must be Result.NotFound不会编译。这是为什么,以及如何测试这个?下面是整个contentService (按要求)--遗憾的是,它目前扩展了Controller,因为我没有找到其他方法来返回Action。实际上,我使用MVC,但也使用了服务+存储层:
class ContentServiceComponent(languageRepository: LanguageRepositoryTrait, nodeRepository: NodeRepositoryTrait) extends Controller
{
def find(language: String) = Action
{
languageRepository.get().map(l => l.code).contains(language) match
{
case true => Ok(s"Homepage for $language")
case false => fourOhFour()
}
}
def fourOhFour() = NotFound(s"Oops, content could not be found")
}
object ContentService extends ContentServiceComponent(LanguageRepository, NodeRepository)发布于 2016-04-05 15:41:33
来自Play控制器的service.find("fr")返回结果
也许你是在比较Result.Status类型的结果吗?
你能用play.api.helper吗?
status(of: Future[Result]) = Await.result(of, timeout.duration).header.status而不是
service.find("fr") must be Result.NotFound试试这样的东西?
status(service.find("fr")) must be NOT_FOUNDNOT_FOUND是一个play.api.http.Status值,只是映射到标准的HTTP代码404
发布于 2016-02-29 17:16:05
相反,find返回Action可以返回Option
def find(language: String): Option[String] =
{
languageRepository.get().map(l => l.code).contains(language) match
{
case true => Some(s"Homepage for $language")
case _ => None
}
}因此,您可以在Controller处理它,如下所示:
def index(language:String) = Action{
ContentService.find(language) match{
case Some(content) => Ok(content)
case _ => NotFound(s"Oops, content could not be found")
}}
你可以做这样的测试用例:
class ContentFetching extends PlaySpec with BeforeAndAfter with MockFactory
{
val languages = List(Language(Some(1), "en", "English",Placeholder"),Language(Some(2), "de", "Deutsch", "Platzhalter")
)
val languagesRepositoryMockHere = new LanguageRepositoryTrait{
override def get = languages //I don't know the implementations
}
"find" must
{
"fail if languageCode is invalid" in
{
private val service = new ContentServiceComponent(languagesRepositoryMockHere,nodeRepositoryMockHere)
service.find("fr") shouldBe None
}
}
}这没有经过测试,但可供参考。
干杯。
https://stackoverflow.com/questions/35682021
复制相似问题