省去直通参数

时间:2013-06-14 15:01:09

标签: unit-testing scala

考虑这个例子:

case class Home(description: String)
case class Person(age: Int, race: String, home: Home)
def age(p: Person): Person = {
  val newAge = p.age + 1
  p.copy(age = newAge, home = if (newAge == 18) Home("Under the bridge") else p.home)
}
it("Should move on 18th birthday") {
  val person18yrs = age(Person(17, "Caucasian", Home("With parents")))
  person18yrs shouldBe Person(18, "Caucasian", Home("Under the bridge"))
}

现在,如果我想测试方法age,我需要填写字段race,即使方法age没有根据person对象进行区分这是比赛。它只是传递参数。在这个简单的例子中,它不是那么多工作,但是当我在20场类层次结构中使用两个字段时,我并不高兴。而且我想要快乐。所以我开始寻找解决方案。

一种解决方案可能是用空值填充空字段。但缺点是如果我然后更改实现,它会将测试类编译错误转换为测试失败。我仍然需要写这些空值。

另一个解决方案可能是创建方法,以便接受并返回与之交互的参数。缺点是我需要返回缺少名称的元组,或者我需要创建一些封装方法参数和返回类型的类。

也许堆栈溢出的聪明人确实有其他解决方案,我智力的半盲目眼睛看不到。 : - )

2 个答案:

答案 0 :(得分:1)

创建一个完全填充的人作为原型,然后使用与您的特定测试用例相关的值创建副本。

val protoype = Person(16, "Caucasian", Home("With parents"))
val person18yrs = age(protoype.copy(age = 17))

答案 1 :(得分:0)

您可以定义与案例类名称相同但名称较少的工厂,并让它们创建您传递默认参数的相应对象,例如:

case class Person(age: Int, race: String, home: Home)

def Person(age: Int): Person = Person(age, "", Home(""))

对这些工厂的访问可能仅限于测试套件,以避免它们被用于应用程序的非休息相关代码。