gpt4 book ai didi

scala - 当 DAO 包含操作时减少测试开销

转载 作者:行者123 更新时间:2023-12-04 08:21:23 26 4
gpt4 key购买 nike

为了访问对象,创建了一个包含返回操作和存储类型对象的函数的 Slick DAO。例子:

def findByKeysAction(a: String, b: String, c: String = {
Users.filter(x => x.a === a && x.b === b && x.c === c).result
}

def findByKeys(a: String, b: String, c: String): Future[Option[foo]] = {
db.run(findByKeysAction(consumerId, contextId, userId)).map(_.headOption)
}

注意非基于 Action 的函数如何在 db.run() 中包装另一个.

什么是测试这两个功能和最小化代码冗余的可靠方法?

我天真的方法当然可以是用他们各自的测试设置来测试它们(上面是一个简单的例子;可能需要很多测试设置来满足数据库限制)。

最佳答案

Notice how the non-action-based function wraps the other in db.run().



并不真地。您的 findByKeys方法不调用 findByUserIdAction ,所以我正在调整这个答案中的那个小细节。
def findByUserIdAction(userId: String) = {
Users.filter(_.userId === userId).result
}

上面的代码返回一个 DBIOAction .如 documentation状态:

Just like a query, an I/O action is only a description of an operation. Creating or composing actions does not execute anything on a database.



就 Slick 的用户而言,对于 DBIOAction 没有有意义的测试。 ,因为它本身什么都不做;这只是一个人想做的事情的食谱。执行上述 DBIOAction ,你必须 materialize它,这就是以下内容:
def findByUserId(userId: String): Future[Option[User]] = {
db.run(findByUserIdAction(userId)).map(_.headOption)
}

物化的结果就是您要测试的结果。一种方法是使用 ScalaTest 的 ScalaFutures 特征。例如,在混合了该特征的规范中,您可以具有以下内容:
"Users" should "return a single user by id" in {
findByUserId("id3").futureValue shouldBe Option(User("id3", ...))
}

看看这个 Slick 3.2.0 test project更多示例:具体来说, TestSpec QueryCoffeesTest .

总之,不要费心去测试 DBIOAction隔离中;只是测试它的物化结果。

关于scala - 当 DAO 包含操作时减少测试开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45463351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com