使用FeatureSpec
进行测试并使用scenario
时,我的部分代码会发送"失败"案例类(即ApplesNotAllowed
)并通过scalaz
分离使用。
快速举例:
val result = if (order.value != 10) {
-\/(ApplesNotSupported(orderNumber))
} else {
\/-Option.empty[Orange]
}
在我的测试套件中,我可以通过期待Option.empty[Orange]
轻松测试我收到shouldBe None
的情况。但是,当我想测试返回的ApplesNotSupported
case类时,我确实遇到了问题。我怎么会期待这个"失败"这将承认测试已经过去,因为我们想要"失败"即将发生?每当我尝试运行我的场景时,我都会收到错误:
Validation is not success ApplesNotSupported(orderNumber)
使用interrupt
尝试无法解决问题,因为它不是例外,我们也不想故意fail
测试。这可能是使用scalaz
和ScalaTest
的问题吗?
我对Scala中的函数编程和编程相当新,所以任何资源或建议都有帮助,因为我在搜索文档时遇到了麻烦。
答案 0 :(得分:4)
您可能希望在测试析取时使用析取匹配器: https://github.com/typelevel/scalaz-scalatest/blob/master/src/main/scala/DisjunctionMatchers.scala
这是根据分离结果进行测试的最佳方法。 您可以根据分离本身进行匹配:
must be_\/-
must be_-\/
或者更进一步,匹配析取的结果及其包含的值:
must be_\/-(value)
must be_-\/(value)
我个人并不使用ScalaTest,但它看起来应该与specs2中的相同。
答案 1 :(得分:1)
如何将它包装在Try中并执行以下操作:
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)
}
}
答案 2 :(得分:0)
我不熟悉scalaz或disjunctions,但听起来像scalatest的断言(http://www.scalatest.org/user_guide/using_assertions)中的拦截功能可能有所帮助。
您可以使用拦截定义预期的异常类型,并运行将在函数中引发异常的代码。您可以将拦截的结果分配给 val ,然后您可以使用断言或断言结果与预期值进行比较>来自scalatest。
希望这可以提供帮助! :)