2016-02-28 4 views
0

Попытка сделать некоторые TDD во время обучения playframework:ScalaTest PlayFramework

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 не будет компилировать. Почему это и как проверить это? Полный контентСервис (по запросу) К сожалению, в настоящее время он расширяет 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) 
+0

Is ContentServices Контроллер? Не могли бы вы опубликовать этот клас или, по крайней мере, найти метод – salc2

+0

Это, хотя я бы предпочел, чтобы это не было, поскольку это еще один слой, который я добавил для развязки. Я добавил класс – Sorona

+0

, что ошибка компилятора? – pedrorijo91

ответ

1

service.find ("FR") от контроллера Play возвращает результат

Может быть, вы сравниваете результат с типом 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

1

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 
    } 
    } 

Так вы cound обрабатывать его в контроллер следующим образом:

def index(language:String) = Action{ 

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

и вы coul d сделать тест-код примерно так:

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 

    } 
    } 
} 

Это не было протестировано, но могло бы помочь справкой.

Cheers.

+0

Конечно, это работает, но этого я не хотел. Обходные решения в порядке, я почти почти сам нахожусь, но я очень хочу узнать, почему он не работает, как я думаю, он должен работать. – Sorona

Смежные вопросы