gpt4 book ai didi

Scala、Specs2 和共享状态

转载 作者:行者123 更新时间:2023-11-28 20:07:31 24 4
gpt4 key购买 nike

我正在编写一些Specs2 规范;看起来像:

class ComponentSpecification extends Specification with Mockito {

private val dependency = mock[Dependency]
private val subject = new Component(..)

"methodOne" should {
"handle happy path" in {
val result = subject.methodOne("Param1", 42)
result must ...
there was one(dependency).something()
}

"deal with border case" in {
val result = subject.methodOne("", -1)
result must ...
there was one(dependency).something()
}
}
}

但是,这些测试失败了,因为 mock[Dependency] 是共享的。

  • 一个解决方案是让它们按顺序排列并在每次测试前重置模拟,但这看起来很奇怪,正如文档中关于“默认并行” 所写:

it encourages to write independent examples when the result of a given example should not be influenced by others

  • 另一种方法是将 val 移至测试本身。但是虽然我应该能够减少重复,但它仍然看起来像一个奇怪的结构。看起来 subject 是有状态的,但它不应该。

  • 我也可以通过验证 atLestOne(dependency).something() 来尝试使用不太严格的方法,但是:

    1. 这不会验证在这个特定的测试用例中调用了该方法,并且
    2. 参数捕获和验证是痛苦的。

所以我的问题是:

如何创建可读的测试并在 mock 上进行详细验证。

非常感谢。

最佳答案

Scopes可以像这样为每个测试提供新鲜状态

class ComponentSpecification extends mutable.Specification with Mockito {
trait FooScope extends Scope {
val dependency = mock[Dependency]
val subject = new Component(dependency)
}

"methodOne" should {
"handle happy path" in new FooScope {
val result = subject.methodOne("Param1", 42)
there was one(dependency).something()
}

"deal with border case" in new FooScope {
val result = subject.methodOne("", -1)
there was one(dependency).something()
}
}
}

无需在每次测试前重置模拟。

关于Scala、Specs2 和共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56232576/

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