Статьи

Внедрение DAL в Play 2.x (Scala), Slick, ScalaTest

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

В продолжении  Play 2.x (Scala) это соперник Spring MVC? — Введение , в этом блоге, я покажу, как мы реализуем простой уровень доступа к данным, используя Scala Test и Behavior Driven Development .

Технический стек, который я буду использовать для этой демонстрации, — это Java 7 , Play 2.1.0 , Scala 2.10.0, Slick 1.0.0, ScalaTest / ScalaMock 3.0, STS IDE для Scala Development, плагин Scala IDE с ScalaTest .

В качестве первого шага создайте проект Play под названием coffee-example и выберите язык Scala, как показано ниже:

play new coffee-example

Теперь нам нужно включить эти зависимости в Build.scala. В этом примере нам не нужен ScalaMock, но мы все равно включим эту зависимость, как показано ниже:

"com.typesafe.slick" %% "slick" % "1.0.0",
...
"org.scalamock" %% "scalamock-scalatest-support" % "3.0" % "test",

Давайте преобразуем этот проект в проект Eclipse, как показано ниже,

play eclipse

Давайте откроем STS IDE и создадим DomainTest.scala в тестовой папке. Намерение состоит в том, чтобы создать новый класс CoffeeComponent и реализовать метод findById, передать имя Coffee, вернуть объект Coffee и указать его цену. Нам также нужно инициализировать данные, которые мы должны утверждать.

class DomainSpec extends FunSpec with ShouldMatchers with InitTrait {
 
  lazy val database = Database.forDataSource(DB.getDataSource())
 
  describe("Coffee Data Access") {
 
    it("should find Coffee object for a given Coffee name") {
      running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
        database withSession {
          init
 
          val cc = new CoffeeComponentImpl()
          val c = cc.find("Colombian")
          c.first.price should equal(799L)
        }
      }
    }
  }
}

Мы создаем признак CoffeeComponent и CoffeeComponentImpl, которые создают базовые операции 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
}
 
class CoffeeComponentImpl extends CoffeeComponent {
 
  def find(pk: String): Query[Coffees.type, Coffee] = {
    Coffees.findByPK(pk)
  }
 
  def findall(pk: String): Query[(Coffees.type, Suppliers.type), (Coffee, Supplier)] = {
    Coffees.findAll(pk)
  }
 
  def list(page: Int, pageSize: Int, orderBy: Int, filter: String): Query[(Coffees.type, Suppliers.type), (Coffee, Supplier)] = {
    Coffees.list(page, pageSize, orderBy, filter)
  }
 
  def delete(pk: String): Int = {
    find(pk).delete
  }
}

Нам также нужно создать данные инициализации для теста, как показано ниже:

trait InitTrait {
  def init = {
    val ddl = (Suppliers.ddl ++ Coffees.ddl)
 
    ddl.drop
    ddl.create
    // Insert some suppliers
    Suppliers.insertAll(
      Supplier(Some(101), "Acme, Inc.", "99 Market Street", "Groundsville", "CA", "95199"))
.....
    Coffees.insertAll(
      Coffee(Some("Colombian"), 101, 799, 0, 0))
}
}

Теперь запустите ScalaTest из Eclipse IDE, вы увидите что-то, как показано ниже:

Пример кофе ScalaTest

Пример кофе ScalaTest

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