ScalaTest:将场景测试标记为预期失败

时间:2017-04-21 00:50:51

标签: scala functional-programming scalatest

使用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测试。这可能是使用scalazScalaTest的问题吗?

我对Scala中的函数编程和编程相当新,所以任何资源或建议都有帮助,因为我在搜索文档时遇到了麻烦。

3 个答案:

答案 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。

希望这可以提供帮助! :)

相关问题