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

How do I use scala and scalatest to see if a list contains an object with a field matching a specific value

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

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

显然这实际上不起作用

每当我必须断言列表的字段时,我都会对列表执行 .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))

至verify/assert/test listOfMyData 包含 MyData,.two 属性的值为 4,您可以在此处过滤符合您过滤功能的元素(。 two==4) 然后测试过滤​​后的长度list/seq

listOfMyData.filter(_.two==4).length > 0

或更好地使用 find 找到第一个匹配项(returns 一个 Optionp[MyData])

listOfMyData.find(_.two==4) != None

使用 FunSuite 和 with/without 匹配器

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

这个怎么样list.map(_.two) should contain (4)

你也可以atLeast(1, dataList) should matchPattern MyData(_, 4)