Scala测试最终配置所有实现?

时间:2018-06-01 15:03:44

标签: scala scalatest

我有许多使用scala中的异步代码运行的测试,我最终使用scala并发。这有助于我知道在给定某个异步事件发生时我可以期待某些值。

但最终有一个超时,可以为每个测试覆盖,所以它不会崩溃,期待一个尚未存在的值......

我想为所有测试更改此超时,并为所有测试更改一次配置。

就代码而言,我会执行以下操作:

class AsyncCharacterTest extends WordSpec
  with Matchers
  with Eventually
  with BeforeAndAfterAll
  with ResponseAssertions {
  "Should provide the character from that where just created" should {
    val character = Character(name = "juan", age = 32)
    service.createIt(character)
    eventually(timeout(2.seconds)){ 
      responseAs[Character] should be character
    }
  }
}

我不想为每个测试编写此超时(2.seconds)...我希望为所有测试配置一个配置,并有机会在特定情况下覆盖此超时。

这最终可能与scala并发吗?这样可以帮我写更多的DRY代码。

做类似

的事情
Eventually.default.timeout = 2.seconds

然后,默认情况下,这适用于所有测试,默认为2秒。

1 个答案:

答案 0 :(得分:2)

基本上,您目前通过eventually(timeout(...))执行的操作)是为隐式参数提供显式值。

实现目标的一种简单方法是执行以下操作:

  1. 从`finally call。
  2. 中删除所有显式timeout()
  3. 创建一个特征,将超时所需的默认值包含为隐式值:

    trait EventuallyTimeout {
     implicit val patienceConfig: PatienceConfig = PatienceConfig(timeout = ..., interval = ...)
    

    }

  4. 将此特征混合到所有测试中:

    class AsyncCharacterTest extends WordSpec extends EventuallyTimeout extends ...
    
  5. 完整示例:

    // likely in a different file
    trait EventuallyTimeout {
        implicit val patienceConfig: PatienceConfig = PatienceConfig(timeout = ..., interval = ...)
    }
    
    class AsyncCharacterTest extends WordSpec
      with Matchers
      with Eventually
      with BeforeAndAfterAll
      with ResponseAssertions 
      with EventuallyTimeout {
          "Should provide the character from that where just created" should {
            val character = Character(name = "juan", age = 32)
            service.createIt(character)
            eventually { 
              responseAs[Character] should be character
            }
          }
    }
    

    有关详细信息,请参阅Eventually docsimplicit

    最后,在旁注中,eventually主要用于集成测试。您可能需要考虑使用不同的机制,例如:

    1. ScalaFutures特质+ whenReady方法 - 类似于eventually方法。
    2. Async * spec对应物(即AsyncFunSpec,AsyncWordSpec等)。