使用ScalaTest在Playframework单元测试中测试CRUD功能

时间:2016-06-17 10:31:22

标签: scala unit-testing

我用scala创建了一些CRUD函数,我想用单元测试来测试它们。例如,我想测试send方法:

MATCH(user:UserAccount)-[:HasPermission]->(permission:Permissions)
WITH user AS UserAccount, collect(permission.action +" "+ permission.resource) as permissions set UserAccount.permissions=permissions
return UserAccount

我该怎么办?有什么例子吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ScalaMock来模拟db实例并设置期望值和返回值。 ScalaTest doc中有一个page

以下示例介绍了方法,可能会出现问题

import org.scalatest.FlatSpec
import org.scalamock.scalatest.MockFactory

class MyFunctionDAOSpec extends FlatSpec with MockFactory {
  val db = mock[DB]
  val col = mock[JSONCollection]
  (col.insert _) expects (myObj) returning (okResult)
  (col.insert _) expects (myObj2) returning (failResult)
  (db.collection _) expects ("myCollection") returning (col) 
  //...

  val dao = new MyFunctionDAO(db)

  "DAO" should "return Right" in {
    dao.save(myObj) should be (Right(myObj._id))
  }

  it should "return Left" in {
    dao.save(myObj2) should be (Left("my error message"))
  }
}

答案 1 :(得分:0)

诚然,我是相对较新的测试,但我会分享我的意见,因为它是伪造的。我认为CRUD操作不应该进行单元测试。它们应该进行集成测试。因为当我们对API方法进行单元测试时,我们试图测试它是否遵守了合同。但究竟是什么意思"这种方法应该将这些属性添加到DB"?比方说,该方法包含一些逻辑,用于解析传入的DTO并将其转换为DB实体/关系/等。但我们不应该测试一些预期的转换结果,因为它"怎么"该方法有效,而不是"什么"它确实:它是实施的测试,而不是合同;更重要的是,只需要整个逻辑,因为我们使用的是DB模型,而不是其他模型,而且它与CRUD操作本身无关。

但是,我们可能不应该保留未经测试的转换逻辑,特别是如果它不是很微不足道的话。所以,我们可以直接测试它:而不是测试write(x)= f(convert(x))实际上尝试编写x,而convert(x)是实现的私有部分(因此从测试中跳过),我们可以跳过单元测试f() - 将其留给集成测试 - 并直接测试转换(x)。