如何使用scala和scalatest查看列表中是否包含字段与特定值匹配的对象

如何使用scala和scalatest查看列表中是否包含字段与特定值匹配的对象,scala,scalatest,Scala,Scalatest,我希望我的测试能够检查对象列表是否包含具有特定匹配字段的对象。例如: 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

我希望我的测试能够检查对象列表是否包含具有特定匹配字段的对象。例如:

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)
}

显然,这实际上不起作用

每当我必须断言列表的字段时,我都会在列表上映射,并比较值。

例如

列表(新的MyData(1,2),新的MyData(3,9))。映射(u.field2)应该包含(4)
将抛出错误
列表(2,9)不包含元素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, 9), new MyData(3, 4)).filter(_.field2 == 4) should not be empty
但我不喜欢这是真是假。例如,
List(new MyData(1,2),new MyData(3,11)).count(uu.field2==4)应该为真
抛出错误
false不等于真

而第一种方法告诉了我更多,因为它给出了什么是输入数据,什么是预期的。至少我发现第一种方法在重构测试时很有用

第三种方法可以是

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, 9), new MyData(3, 4)).filter(_.field2 == 4) should not be empty
但是我希望scalatest也有类似的
List(new MyData(1,2),new MyData(3,4))应该包含(MyData(uu,4))

要验证/断言/测试listOfMyData是否包含MyData,其中4是.two属性的值,您可以在此处筛选与筛选函数匹配的元素(.two==4),然后测试筛选后的列表的长度/seq

listOfMyData.filter(_.two==4).length > 0
或者最好使用find查找第一个匹配项(返回Optionp[MyData])

带FunSuite和带/不带匹配器

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)
  }
}

这个
列表怎么样。映射(uu.two)应该包含(4)


你也可以做
至少(1,数据列表)应该匹配模式MyData(uz,4)

请给你的答案添加一些解释。只需注意,根据规范2,你可以写
列表必须包含((数据:MyData)=>data.two==4)
至少
的用法值得投票,这是一种比
list.map应该包含的内容更具表现力的方式。遗憾的是,没有
只有(Int,…)
atMost