如何在测试中重新创建ZIO层?

问题描述 投票:0回答:1

我有一个包含 3 个测试的测试套件,例如:

val test1 = test("should do smth") {
    for {
        service <- ZIO.service[MyCustomService]
        res <- service.doSmth
    } yield assertTrue(res.isEmpty)
}.provide(MyCustomServiceImpl.layer)

val test2 = test("should do smth else") {
    for {
        service <- ZIO.service[MyCustomService]
        res <- service.doSmthElse
    } yield assertTrue(res.size == 1)
}.provide(MyCustomServiceImpl.layer)

val test3 ...

在每个测试执行期间,我都有相同的 MyCustomService 实例(因为打印哈希码在所有测试中返回相同的结果)。由于 MyCustomService 内部包含缓存,因此有时一些测试会随机失败。 ZIO 是否有 Spring 框架中的 @DirtiesContext 之类的某些方面,或者我可能使用不正确的方法编写测试?

我尝试搜索ZIO测试方面,但找不到适用的东西。目前,我在每个测试开始时使用解决方法清除缓存并使用

@@ sequential
方面。

scala zio zio-test
1个回答
1
投票

首先,让我明确指出,您的评论是错误的:这不仅绝对没问题,而且强烈建议根据需要设计和重构您的服务,使其更易于测试,并与缓存似乎违反了单一职责原则,因此您的设计很可能会受益于评论中建议的重构。

但是要回答您原来的问题,问题似乎在于如何实现

MyCustomServiceImpl.layer
的具体方式,而您尚未展示。

我尝试像这样重现你的问题:

object ZIOFooSpec extends ZIOSpecDefault {
   class Foo() { def identify = hashCode.toString } 
   object Foo  { val layer = ZIOLayer.succeed(new Foo()) }

   val t = test("Foo")(
     ZIO.serviceWithZIO[Foo](s => ZIO.log(s.identify)).map(_ => assertTrue(true))
   ).provide(Foo.layer)
   override def spec = suite(t, t, t) @@ sequential
}

当我运行它时,它会打印三个不同的数字。

© www.soinside.com 2019 - 2024. All rights reserved.