在光滑的scala中测试DAL时出错

时间:2014-11-05 06:28:11

标签: scala slick scalatest

scala和play非常新,我被分配了一个测试别人应用程序的任务,运行正常btw.Please检查我的测试是否正确以及错误是什么。

这是模型中的employeeEntry.scala文件

 package models

import models.database.Employee
import play.api.db.slick.Config.driver.simple._
import play.api.db.slick._
import play.api.Play.current


case class EmployeeEntry(eid :Int, ename: String, eadd: String, emob: String)

object Employee {

val DBemp = TableQuery[Employee]


def savedat(value: EmployeeEntry):Long = {
    DB.withSession { implicit session =>
       DBemp+=EmployeeEntry(eid=value.eid,ename=value.ename,eadd=value.eadd,emob=value.emob)
    }}

/*val query = for (c <- Employee) yield c.ename 
    val result = DB.withSession {
                                 implicit session =>
                                 query.list // <- takes session implicitly
                                }*/
        //val query = for (c <- Employee) yield c.ename
   def getPersonList: List[EmployeeEntry] = DB.withSession { implicit session =>      DBemp.list }

  def Update: Int = DB.withSession { implicit session =>
 (DBemp filter (_.eid === 1) map (s => (s.ename,s.eadd))) update ("test","khair")}

  def delet :Int =DB.withSession {
  implicit session => (DBemp filter (_.eid === 1)).delete
}






 }

这是模型/数据库中的文件Employee.scala

 package models.database

 import models._
 import models.EmployeeEntry
 import play.api.db.slick.Config.driver.simple._
 import scala.slick.lifted._

 class Employee(tag:Tag) extends Table[EmployeeEntry](tag,"employee") 
 {



   //val a = "hello"
  def eid = column[Int]("eid", O.PrimaryKey)
  def ename = column[String]("name", O.DBType("VARCHAR(50)"))
  def emob = column[String]("emob",O.DBType("VARCHAR(10)"))
  def eadd =column[String]("eadd",O.DBType("VARCHAR(100)"))
  def * = (eid, ename, emob, eadd) <> (EmployeeEntry.tupled, EmployeeEntry.unapply)


 }

最后这是我正在运行的测试,这是失败的:

 import play.api.db.slick.Config.driver.simple._
 import play.api.db.slick._
 import play.api.Play.current



 import org.scalatest.FunSpec
 import org.scalatest.matchers.ShouldMatchers
 import models.database.Employee
 import scala.slick.lifted._ 
 import models._
 import models.EmployeeEntry
 //import scala.slick.driver.H2Driver.simple._


 class databasetest extends FunSpec with ShouldMatchers{


   describe("this is to check database layer"){ 

       it("can save a row"){

            val a = EmployeeEntry(1006,"udit","schd","90909090")
            Employee.savedat(a) should be (1)


      }     


     it("getpersonlist"){



            Employee.getPersonList.size should be (1)


    }


     }

  }

测试失败,错误

  java.lang.RuntimeException: There is no started application
  at scala.sys.package$.error(package.scala:27)
  at play.api.Play$$anonfun$current$1.apply(Play.scala:71)
  at play.api.Play$$anonfun$current$1.apply(Play.scala:71)
  at scala.Option.getOrElse(Option.scala:120)
  at play.api.Play$.current(Play.scala:71)
  at models.Employee$.getPersonList(EmployeeEntry.scala:27)
  at databasetest$$anonfun$1$$anonfun$apply$mcV$sp$2.apply$mcV$sp(databasetest.scala:39)
  at databasetest$$anonfun$1$$anonfun$apply$mcV$sp$2.apply(databasetest.scala:39)
  at databasetest$$anonfun$1$$anonfun$apply$mcV$sp$2.apply(databasetest.scala:39)
  at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)

1 个答案:

答案 0 :(得分:0)

默认情况下play提供了spec2测试框架。因此无需为单元测试添加scalatest框架。对于数据库访问层测试需要与数据库建立连接以便启动虚假应用程序。(这不是运行代码,只是一个想法写单元测试) 有关详细信息,请查看文档:{​​{3}}

import org.specs2.mutable.Specification

import models.database.Employee
import models._
import models.EmployeeEntry
import play.api.test.FakeApplication
import play.api.test.Helpers.running
import play.api.Play.current


class databasetest extends Specification {

 "database layer" should {
     "save a row" in {
        running(FakeApplication()) {
           val a = EmployeeEntry(1006,"udit","schd","90909090")
           Employee.savedat(a) must be equalTo (1)
         }
       }
    "get list" in {
         running(FakeApplication()) {
           Employee.getPersonList.size must be equalTo (1)
         }
     }
}