ScalaTest:将场景测试标记为预期失败
当使用ScalaTest:将场景测试标记为预期失败,scala,functional-programming,scalatest,Scala,Functional Programming,Scalatest,当使用FeatureSpec进行测试并使用scenario时,我的部分代码发送一个“失败”案例类(即ApplesNotAllowed),并通过scalaz析取使用 快速示例: val result = if (order.value != 10) { -\/(ApplesNotSupported(orderNumber)) } else { \/-Option.empty[Orange] } 在我的测试套件中,我可以很容易地测试接收到选项的情况。空[橙色],方法是期望它
FeatureSpec
进行测试并使用scenario
时,我的部分代码发送一个“失败”案例类(即ApplesNotAllowed
),并通过scalaz
析取使用
快速示例:
val result = if (order.value != 10) {
-\/(ApplesNotSupported(orderNumber))
} else {
\/-Option.empty[Orange]
}
在我的测试套件中,我可以很容易地测试接收到选项的情况。空[橙色]
,方法是期望它应该为None
。然而,当我想测试正在返回的ApplesNotSupported
case类时,我确实遇到了一个问题。既然我们希望“失败”发生,那么我怎么能指望这个“失败”会承认测试通过呢?每当我尝试运行我的场景时,我都会得到错误:
Validation is not success ApplesNotSupported(orderNumber)
尝试使用中断
并不能解决问题,因为这不是一个例外,我们也不想故意使测试失败。使用scalaz
和ScalaTest
会有问题吗
我对函数式编程和Scala中的编程都是相当陌生的,所以任何资源或建议都会有所帮助,因为我在搜索文档时遇到了困难 在测试析取时,您可能希望使用析取匹配器: 这是基于析取结果进行测试的最佳方法。 可以根据析取本身进行匹配:
must be_\/-
must be_-\/
或者更进一步,匹配析取的结果及其包含的值:
must be_\/-(value)
must be_-\/(value)
我个人不使用ScalaTest,但它看起来应该与specs2中的相同。在测试析取时,您可能希望了解析取匹配器的使用: 这是基于析取结果进行测试的最佳方法。 可以根据析取本身进行匹配:
must be_\/-
must be_-\/
或者更进一步,匹配析取的结果及其包含的值:
must be_\/-(value)
must be_-\/(value)
我个人并不使用ScalaTest,但它看起来应该与specs2中的相同。我对scalaz或析取都不熟悉,但听起来ScalaTest断言()中的拦截功能可能会有所帮助 您可以使用intercept定义期望的异常类型,并运行将在函数中引发异常的代码。您可以将截距的结果分配给val,然后您可以使用scalatest中的assert或assertResult与预期值进行比较
希望这能有所帮助!:) 我对scalaz或析取都不熟悉,但听起来scalatest断言()中的拦截功能可能会有所帮助 您可以使用intercept定义期望的异常类型,并运行将在函数中引发异常的代码。您可以将截距的结果分配给val,然后您可以使用scalatest中的assert或assertResult与预期值进行比较
希望这能有所帮助!:) 把它包装起来,试试这样做:
import org.scalatest.{FunSuite, Matchers}
import org.specs2.mock.Mockito
import scala.util.{Failure, Success, Try}
/**
* Created by ssharma on 4/18/17.
*/
class UnitTest extends FunSuite with Matchers{
class A {
def t1(x: Int): Try[Int] = Try(t(x))
private def t(x: Int): Int = {
x match {
case 1 => 1
case _ => throw new RuntimeException
}
}
}
test("A") {
val b = new A
assert(b.t1(1)isSuccess)
}
test("A fail") {
val b = new A
assert(b.t1(2)isFailure)
}
}
把它包起来怎么样?试试这样做:
import org.scalatest.{FunSuite, Matchers}
import org.specs2.mock.Mockito
import scala.util.{Failure, Success, Try}
/**
* Created by ssharma on 4/18/17.
*/
class UnitTest extends FunSuite with Matchers{
class A {
def t1(x: Int): Try[Int] = Try(t(x))
private def t(x: Int): Int = {
x match {
case 1 => 1
case _ => throw new RuntimeException
}
}
}
test("A") {
val b = new A
assert(b.t1(1)isSuccess)
}
test("A fail") {
val b = new A
assert(b.t1(2)isFailure)
}
}
通过析取,您可以对结果进行模式匹配,从而避免涉及不必要的异常。这正是析取匹配器在其实现中所做的:通过析取,您可以对结果进行模式匹配,从而避免不必要的异常。这正是析取匹配器在其实现中所做的:感谢您在参考资料中指出这一点。我没有想到我们也应该使用析取来测试,并且过于专注于看到最终结果。谢谢你在参考资料中指出了这一点。我没有想到我们也应该使用析取来测试,并且过于专注于看到最终结果。