[英]ScalaTest PlayFramework
在學習游戲框架時嘗試做一些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,但也使用Service +存儲庫層:
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)
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
}
}
}
這未經測試,但可以幫助參考。
干杯。
播放控制器中的service.find(“ fr”)返回結果
也許您正在將Result與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_FOUND
NOT_FOUND
是play.api.http.Status
值,僅映射到標准HTTP狀態代碼404
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.