ScalaTest:将场景测试标记为预期失败
ScalaTest: Marking a scenario test as an expected failure
在使用 FeatureSpec
进行测试并使用 scenario
时,我的部分代码会发送 "failure" 案例 class(即 ApplesNotAllowed
) 并通过 scalaz
析取使用。
快速示例:
val result = if (order.value != 10) {
-\/(ApplesNotSupported(orderNumber))
} else {
\/-Option.empty[Orange]
}
在我的测试套件中,我可以通过预期 shouldBe None
来轻松测试收到 Option.empty[Orange]
的情况。但是,当我想测试返回的 ApplesNotSupported
案例 class 时,我 运行 遇到了问题。由于我们希望 "failure" 发生,我怎么会期望这个 "failure" 会确认测试通过?每当我尝试 运行 我的场景时,我都会收到错误消息:
Validation is not success ApplesNotSupported(orderNumber)
尝试使用 interrupt
并没有解决问题,因为它不是一个例外,我们也不想故意 fail
测试。使用 scalaz
和 ScalaTest
会不会有问题?
总体而言,我对函数式编程和 Scala 编程还很陌生,所以任何资源或建议都会对我有所帮助,因为我在搜索文档时确实遇到了麻烦。
您可能想在测试析取时查看使用析取匹配器:
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里面的一样。
我不熟悉 scalaz 或析取,但听起来 scalatest 的断言 (http://www.scalatest.org/user_guide/using_assertions) 中的拦截功能可能会有所帮助。
您使用 intercept 定义了您期望的异常类型,并且您 运行 将在函数内抛出异常的代码。您可以将 intercept 的结果分配给 val 然后您可以使用 assert[=22= 将其与预期值进行比较] 或 assertResult 来自 scalatest.
希望对您有所帮助! :)
如何将它包装在尝试做这样的事情:
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)
}
}
在使用 FeatureSpec
进行测试并使用 scenario
时,我的部分代码会发送 "failure" 案例 class(即 ApplesNotAllowed
) 并通过 scalaz
析取使用。
快速示例:
val result = if (order.value != 10) {
-\/(ApplesNotSupported(orderNumber))
} else {
\/-Option.empty[Orange]
}
在我的测试套件中,我可以通过预期 shouldBe None
来轻松测试收到 Option.empty[Orange]
的情况。但是,当我想测试返回的 ApplesNotSupported
案例 class 时,我 运行 遇到了问题。由于我们希望 "failure" 发生,我怎么会期望这个 "failure" 会确认测试通过?每当我尝试 运行 我的场景时,我都会收到错误消息:
Validation is not success ApplesNotSupported(orderNumber)
尝试使用 interrupt
并没有解决问题,因为它不是一个例外,我们也不想故意 fail
测试。使用 scalaz
和 ScalaTest
会不会有问题?
总体而言,我对函数式编程和 Scala 编程还很陌生,所以任何资源或建议都会对我有所帮助,因为我在搜索文档时确实遇到了麻烦。
您可能想在测试析取时查看使用析取匹配器: 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里面的一样。
我不熟悉 scalaz 或析取,但听起来 scalatest 的断言 (http://www.scalatest.org/user_guide/using_assertions) 中的拦截功能可能会有所帮助。
您使用 intercept 定义了您期望的异常类型,并且您 运行 将在函数内抛出异常的代码。您可以将 intercept 的结果分配给 val 然后您可以使用 assert[=22= 将其与预期值进行比较] 或 assertResult 来自 scalatest.
希望对您有所帮助! :)
如何将它包装在尝试做这样的事情:
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)
}
}