我希望我的测试检查对象列表是否包含具有特定匹配字段的对象。例如:
class ListTest extends ScalaTesting {
class MyData(val one:Int, val two:Int) {
}
val listOfMyData = List(new MyData(1,2), new MyData(3,4)
listOfMyData should contain (a mydata object with field two matching 4)
}
显然这实际上并不起作用
答案 0 :(得分:1)
每当我必须断言列表字段时,我会在列表上 .map
并比较值。
例如
class SomeSpecs extends FunSuite with Matchers {
test("contains values") {
case class MyData(field1: Int, field2: Int)
List(new MyData(1,2), new MyData(3,4)).map(_.field2) should contain (4)
}
}
List(new MyData(1,2), new MyData(3,9)).map(_.field2) should contain (4)
会抛出错误List(2, 9) did not contain element 4
。
第二种方法是
List(new MyData(1, 2), new MyData(3, 9)).count(_.field2 == 4) > 0 shouldBe true
// or
List(new MyData(1, 2), new MyData(3, 4)).count(_.field2 == 4) should be > 0
但我不喜欢这件事是真是假。例如。 List(new MyData(1, 2), new MyData(3, 11)).count(_.field2 == 4) shouldBe true
引发错误false was not equal to true
虽然第一种方法告诉我更多,因为它给出了输入数据和预期的内容。至少我发现第一种方法在重构测试时很有帮助。
第三种方法可以
List(new MyData(1, 9), new MyData(3, 4)).filter(_.field2 == 4) should not be empty
但我 WISH scalatest也有类似的东西
List(new MyData(1,2), new MyData(3,4)) should contain (MyData(_, 4))
答案 1 :(得分:0)
验证/断言/测试listOfMyData包含MyData,其中4为 .two属性的值,你可以在这里过滤与你的过滤函数匹配的元素( .two == 4)然后测试过滤列表/ seq的长度
listOfMyData.filter(_.two==4).length > 0
或者更好地使用find来查找第一个匹配项(返回Optionp [MyData])
listOfMyData.find(_.two==4) != None
使用FunSuite并使用/不使用Matchers
class MyDataTestSuite extends FunSuite with Matchers {
test("test") {
case class MyData(one: Int, two: Int)
val listOfMyData = List(new MyData(1,2), new MyData(3,4))
listOfMyData.find(_.two==4) should not be None
// equivalent to
assert(listOfMyData.find(_.two==4) != None)
}
}
答案 2 :(得分:0)
这个list.map(_.two) should contain (4)
您也可以atLeast(1, dataList) should matchPattern MyData(_, 4)