Вопрос по playframework, testing, scala, dependency-injection, playframework-2.0 – Макет объектов в игре [2.0]

8

Я хочу протестировать свое приложение Play, предоставляя фиктивные объекты во время теста. Вдобавок ко всему, есть несколько способов сделать это.

Provide an alternative route files during testing Use Dependency Injection, and check for a global value at runtime

Я не уверен, что более выполнимо, или как делать их. Любое понимание будет с благодарностью.

Ваш Ответ

4   ответа
6

У меня был тот же вопрос, и я экспериментировал с некоторыми вариантами:

  • cake pattern
  • injection via implicit
  • spring

Вы можете увидеть код на GitHubВот.

3

Мое решение аналогично Блейку, за исключением того, что я сделал это без контроллеров в качестве классов. Вы можете проверитьисточник здесь.

Автор заявил, что не принял ответ, потому что он искал другие ответы.
Хорошо, просто хотел убедиться, что вы знаете, что этот вопрос был опубликован 5 месяцев назад, поцарапайте его, спросили 1 год и 5 месяцев назад. Я не голосовал или что-то в этом роде, мне это показалось немного странным.
Этот вопрос был размещен 5 месяцев назад ...
13

Есть третий путь; создать свой контроллер как класс или черту для тестирования. Вот простой пример.

Ваша черта + реализация:

package services

trait MyService {
  def getUser(id:String):User
}

class ConcreteService extends MyService {
  override def getUser(id:String):User = {
  //Do real stuff
  }
}

В вашем классе контроллеров:

package controllers

import services._

class Users(service: MyService) extends Controller {
  def show(id: String) = Action {
    val user = service.getUser(id)
    Ok(views.html.user(user))
  }
}

object Users extends controllers.Users(new ConcreteService()) {}

Теперь вы можете запустить несколько юнит-тестов ..

package test

import controllers.Users
import play.api.test._
import play.api.test.Helpers._

import org.specs2.mock.Mockito
import org.specs2.mutable.Specification

class UsersSpec extends Specification with Mockito {
  val service = mock[MyService]

  "Users controller" should {
    "list users" in {
      //Insert mocking stuff here

      val users = new Users(service)
      val result = users.show("somerandomid")(FakeRequest())
      status(result) must equalTo(OK)
    }
  }
}
Привет Бланке, спасибо за очень подробный пример. Я проголосовал за ваш ответ, но не хочу отмечать его как принятый, так как считаю, что многие решения могут быть перечислены одинаково. Jacob Groundwater
Стоит упомянуть в этом ответе, что для работы нужно добавить зависимости Mockito в build.scala. Как и в настоящее время в 2.1, это выглядит так: & quot; org.mockito & quot; % & quot; mockito-all & quot; % "1,9,5"
2

Для справки я добавил пример использования инфраструктуры плагинов Play для введения макетов объектов во время тестирования.

  1. http://www.underflow.ca/blog/935/mock-dependency-injection-in-play-2-0

Использование этого метода смоделированного плагина может быть предоставлено во время тестирования:

class Test extends Specification {
    "application" should {
        "load mock dependency" in {
            running(TestServer(9000, FakeApplication(

            // The plugin at this class replaces the default
            additionalPlugins = Seq("test.MockInjector")

            )), HTMLUNIT) { browser =>
                browser.goTo("http://localhost:9000")

                // Test mock controller

            }
        }
    }
}

MockInjector может использоваться для предоставления объектов контроллера или любого другого компонента для инъекций.

NoteЯ написал запись в блоге, и любой желающий может свободно перенести любой контент из блога сюда.

Похожие вопросы