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 测试。使用 scalazScalaTest 会不会有问题?

总体而言,我对函数式编程和 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)
  }
}