导入
设置单元测试
学习如何实现一个测试仓库,用于测试我们的纯服务。
单元测试
模型测试在此省略,因为它们与不纯部分的测试本质上相同。与对不纯服务的测试不同,我们现在将为路由编写单元测试。
这意味着我们可以在不启动数据库的情况下测试路由逻辑。
测试仓库
为了能够测试我们的路由,首先需要实现一个 TestRepository,它将替代连接到数据库的具体实现。
1class TestRepository[F[_]: Effect](data: Seq[Product]) extends Repository[F] { 2 override def loadProduct(id: ProductId) = { 3 data.find(_.id === id) match { 4 case None => Seq.empty.pure[F] 5 case Some(p) => 6 val ns = p.names.toNonEmptyList.toList.to[Seq] 7 ns.map(n => (p.id, n.lang, n.name)).pure[F] 8 } 9 } 10 11 override def loadProducts() = { 12 Stream.empty 13 } 14 15 override def saveProduct(p: Product): F[Int] = 16 data.find(_.id === p.id).fold(0.pure[F])(_ => 1.pure[F]) 17 18 override def updateProduct(p: Product): F[Int] = 19 data.find(_.id === p.id).fold(0.pure[F])(_ => 1.pure[F]) 20}
如你所见,我们尽量保持抽象(此处使用了我们的 HKT F[_]),并且省略了 loadProducts 的实现,因为它将始终返回一个空流。稍后我们会回到这一点。请回顾 第11行。
除此之外,该类可以接收一个(可能为空)的 Product 实体列表作为初始化参数,这些实体将充当“数据库”。
save 和 update 方法不会修改任何数据。它们仅根据产品是否存在于种子数据列表中,返回 0 或 1。