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

时间:2017-07-11 08:12:29

标签: 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 matching 4)
}

显然这实际上并不起作用

3 个答案:

答案 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)