我们是否需要测试因异常而失败的 public 方法的失败场景?
Do we need to test a failure scenario of a public method which fails with an Exception?
我有案例classEmployee
定义为 case class Employee(.........fields.....)
我有一个方法说
def getEmployees(organization: String): Future[Seq[Employee]] = {
val result = employeeClient.getAllEmployees(organization)
// some logic on this list of Employees received from the
client and manipulate it to get finalListOfEmployees and return it
to caller of `getEmployees`//
finalListOfEmployees
//end //
}
现在我使用 scala mock 测试 getEmployees
。我不处理来自 getEmployees
或不来自 recovering
的异常。这意味着出现在 getAllEmployees
客户端方法的异常将返回到 getEmployees
.
的调用者
现在的问题是我们需要测试这方面吗?
我的意思是以下测试是否增加了任何价值??
"Fail with future" in { (mockEmployeeClient.getAllEmployees_).expects("SomeOrganization").returning(Future.failed(new Exception("failed"))
getEmployees("SomeOrganization).failed.futureValue.getMessage shouldBe "failed"
}
首先,如果你因为想使用函数式编程而使用 scala,那么最好以更函数式的方式处理错误情况,例如用 Try monad 包装对 getAllEmployees 的调用。
除此之外,测试必须涵盖应用程序的所有可能场景,以确保您的程序在该情况下能够正常运行。因此,如果可能发生此异常,也应该对其进行测试,方法与任何其他输出相同
我认为我们应该测试它,因为这里的语义似乎是 getEmployees
的调用者期望失败由失败的 Future
表示。现在考虑如果有人重构 getEmployees
使得 employeeClient.getAllEmployees(organization)
中的失败通过返回一个空列表 Future(Nil)
而不是像这样
来恢复会发生什么
def getEmployees(organization: String): Future[Seq[Employee]] = {
val result = employeeClient.getAllEmployees(organization)
result.recover { case e => List.empty[Employee] }
...
}
一切都可以像以前一样正常编译,但语义突然大不相同。单元测试可以捕获这种语义变化,并提示我们适当地删除重构或更新 getEmployees
的调用方。
我有案例classEmployee
定义为 case class Employee(.........fields.....)
我有一个方法说
def getEmployees(organization: String): Future[Seq[Employee]] = {
val result = employeeClient.getAllEmployees(organization)
// some logic on this list of Employees received from the
client and manipulate it to get finalListOfEmployees and return it
to caller of `getEmployees`//
finalListOfEmployees
//end //
}
现在我使用 scala mock 测试 getEmployees
。我不处理来自 getEmployees
或不来自 recovering
的异常。这意味着出现在 getAllEmployees
客户端方法的异常将返回到 getEmployees
.
现在的问题是我们需要测试这方面吗?
我的意思是以下测试是否增加了任何价值??
"Fail with future" in { (mockEmployeeClient.getAllEmployees_).expects("SomeOrganization").returning(Future.failed(new Exception("failed"))
getEmployees("SomeOrganization).failed.futureValue.getMessage shouldBe "failed"
}
首先,如果你因为想使用函数式编程而使用 scala,那么最好以更函数式的方式处理错误情况,例如用 Try monad 包装对 getAllEmployees 的调用。 除此之外,测试必须涵盖应用程序的所有可能场景,以确保您的程序在该情况下能够正常运行。因此,如果可能发生此异常,也应该对其进行测试,方法与任何其他输出相同
我认为我们应该测试它,因为这里的语义似乎是 getEmployees
的调用者期望失败由失败的 Future
表示。现在考虑如果有人重构 getEmployees
使得 employeeClient.getAllEmployees(organization)
中的失败通过返回一个空列表 Future(Nil)
而不是像这样
def getEmployees(organization: String): Future[Seq[Employee]] = {
val result = employeeClient.getAllEmployees(organization)
result.recover { case e => List.empty[Employee] }
...
}
一切都可以像以前一样正常编译,但语义突然大不相同。单元测试可以捕获这种语义变化,并提示我们适当地删除重构或更新 getEmployees
的调用方。