我有许多使用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秒。
答案 0 :(得分:2)
基本上,您目前通过eventually(timeout(...))
执行的操作)是为隐式参数提供显式值。
实现目标的一种简单方法是执行以下操作:
timeout()
创建一个特征,将超时所需的默认值包含为隐式值:
trait EventuallyTimeout {
implicit val patienceConfig: PatienceConfig = PatienceConfig(timeout = ..., interval = ...)
}
将此特征混合到所有测试中:
class AsyncCharacterTest extends WordSpec extends EventuallyTimeout extends ...
完整示例:
// 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
docs和implicit。
最后,在旁注中,eventually
主要用于集成测试。您可能需要考虑使用不同的机制,例如:
ScalaFutures
特质+ whenReady
方法 - 类似于eventually
方法。