Scala 如何定义合成集合的“LoneeElement”和“Empty”?
我有一个case类,它是一个围绕集合的简单包装器:Scala 如何定义合成集合的“LoneeElement”和“Empty”?,scala,scalatest,Scala,Scalatest,我有一个case类,它是一个围绕集合的简单包装器: final case class Foo(foos: Seq[Int]) 在我的测试中,我想断言Foo#foos的空元素和孤立元素。我目前通过直接访问Foo#foos来规避这个问题: foo.foos shouldBe empty 或 这是可行的,但破坏了封装 我已经浏览了scalatest文档,但是还没有找到一种方法来定义这些操作符 我如何定义它们?将它们内联到测试中的额外点数。定义一些用于处理Foo(在test-目录中,而不是在main
final case class Foo(foos: Seq[Int])
在我的测试中,我想断言Foo#foos
的空元素和孤立元素。我目前通过直接访问Foo#foos
来规避这个问题:
foo.foos shouldBe empty
或
这是可行的,但破坏了封装
我已经浏览了scalatest文档,但是还没有找到一种方法来定义这些操作符
我如何定义它们?将它们内联到测试中的额外点数。定义一些用于处理
Foo
(在test
-目录中,而不是在main
源代码树中):
现在,只需将traitfooists
混合到您想要使用它的FlatSpec
中:
import org.scalatest._
class FooSpec extends FlatSpec with Matchers with FooImplicits {
"Foo" should "be empty when it's empty" in {
Foo(Seq()) shouldBe empty
}
it should "have loneElements" in {
val x = Foo(Seq(1))
x.loneElement should equal (1)
}
}
利润:
[info] Foo
[info] - should be empty when it's empty
[info] - should have loneElements
请注意,
FooImplicits
可以在与main
树中的Foo
相同的包中定义,即使它位于完全不同的test
源代码树中。通过这种方式,它可以访问Foo
的包可见成员,它真的是Seq[Int]
,而不是一些通用的Foo[a](foos:Seq[a])
?@AndreyTyukin它是一种特殊类型,但我的case类并不像上面的case类那么愚蠢=this.elems.isEmpty}
可以工作吗?@mfirry和LoneElement
“专门化”是指“具体的、非通用的”,而不是“通用的和@specialized的”。我想你说的是我希望你说的,只是想指出,调用类型“specialized”可能会让人困惑,因为泛型有“@specialized”注释;)杰出的干杯
import org.scalatest._
class FooSpec extends FlatSpec with Matchers with FooImplicits {
"Foo" should "be empty when it's empty" in {
Foo(Seq()) shouldBe empty
}
it should "have loneElements" in {
val x = Foo(Seq(1))
x.loneElement should equal (1)
}
}
[info] Foo
[info] - should be empty when it's empty
[info] - should have loneElements