Статьи

Реализация контроллера с использованием Play 2.x (Scala), ScalaMock

Для людей, которые спешат, вот код и шаги .

В продолжении  Play 2.x (Scala) это соперник Spring MVC? — Введение , в этом блоге, я покажу, как мы реализуем простую реализацию Контроллера, используя ScalaTest / ScalaMock. Я продолжу свой предыдущий пример реализации DAL в Play 2.x (Scala), Slick, ScalaTest  основных операций CRUD в каталоге Coffee.

В нашем предыдущем примере мы уже реализовали черту DAL под названием CoffeeComponent с базовым CRUD, как показано ниже:

trait CoffeeComponent {
  def find(pk: String): Query[Coffees.type, Coffee]
  def findall(pk: String): Query[(Coffees.type, Suppliers.type), (Coffee, Supplier)]
  def list(page: Int, pageSize: Int, orderBy: Int, filter: String): Query[(Coffees.type, Suppliers.type), (Coffee, Supplier)]
  def delete(pk: String): Int
}

Мы строим инъекцию CoffeeComponent в CoffeeController и создаем объект Singleton с тем же именем, как показано ниже:

class CoffeesController(coffeeComponent: CoffeeComponent) extends Controller {
...
  def delete(pk: String) = Action {
    database withSession {
      println("in db session")
      Home.flashing(coffeeComponent.delete(pk) match {
        case 0 => "failure" -> "Entity has Not been deleted"
        case x => "success" -> s"Entity has been deleted (deleted $x row(s))"
      })
    }
  }
}
 
object CoffeesController extends CoffeesController(new CoffeeComponentImpl)

Как показано выше, у нас есть метод удаления, мы создадим ScalaMock для имитации метода удаления coffeeComponent и управления ожидаемым поведением для возврата 1 выполненной строки и подтверждения статуса HTTP SEE_OTHER, как показано ниже,

class CoffeesControllerTest extends FunSpec with ShouldMatchers with MockFactory {
  describe("Coffee Controller with Mock test") {
 
    it("should delete a coffee record with assert on status") {
      running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
        val mockComponent = mock[CoffeeComponent]
        (mockComponent.delete _).expects("Columbian") returning (1) twice
        val controller = new CoffeesController(mockComponent)
        mockComponent.delete("Columbian") should equal (1)
        val result = controller.delete("Columbian")(FakeRequest())
        status(result) should equal (SEE_OTHER)
      }
    }
  }
}

Если вы заметили, мы расширяем FunSpec из ScalaTest для BDD . Также HTTP-статус SEE_OTHER , потому что успех перенаправлен на страницу индекса.

Теперь, если вы запустите ScalaTest, вы увидите результат в STS, как показано ниже,

Пример кофе ScalaTest со ScalaMock

Пример кофе ScalaTest со ScalaMock

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