首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScalaTest PlayFramework

ScalaTest PlayFramework
EN

Stack Overflow用户
提问于 2016-02-28 11:39:07
回答 2查看 131关注 0票数 0

在学习游戏框架的同时尝试做一些TDD:

代码语言:javascript
复制
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会调用:

代码语言:javascript
复制
def fourOhFour() = NotFound(s"Oops, content could not be found")

然而,断言service.find("fr") must be Result.NotFound不会编译。这是为什么,以及如何测试这个?下面是整个contentService (按要求)--遗憾的是,它目前扩展了Controller,因为我没有找到其他方法来返回Action。实际上,我使用MVC,但也使用了服务+存储层:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-05 15:41:33

来自Play控制器的service.find("fr")返回结果

也许你是在比较Result.Status类型的结果吗?

你能用play.api.helper吗?

代码语言:javascript
复制
status(of: Future[Result]) = Await.result(of, timeout.duration).header.status

而不是

代码语言:javascript
复制
service.find("fr") must be Result.NotFound

试试这样的东西?

代码语言:javascript
复制
status(service.find("fr")) must be NOT_FOUND

NOT_FOUND是一个play.api.http.Status值,只是映射到标准的HTTP代码404

票数 0
EN

Stack Overflow用户

发布于 2016-02-29 17:16:05

相反,find返回Action可以返回Option

代码语言:javascript
复制
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处理它,如下所示:

代码语言:javascript
复制
def index(language:String) = Action{

ContentService.find(language) match{
  case Some(content) => Ok(content)
  case _ => NotFound(s"Oops, content could not be found")
}

}

你可以做这样的测试用例:

代码语言:javascript
复制
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

    }
  }
}

这没有经过测试,但可供参考。

干杯。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35682021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档