【问题标题】:ScalaTest: Marking a scenario test as an expected failureScalaTest:将场景测试标记为预期失败
【发布时间】:2017-04-21 10:26:40
【问题描述】:

在使用FeatureSpecscenario 进行测试时,我的部分代码发送“失败”案例类(即ApplesNotAllowed)并通过scalaz 析取使用。

快速示例:

val result = if (order.value != 10) {
    -\/(ApplesNotSupported(orderNumber))
  } else {
    \/-Option.empty[Orange]
  }

在我的测试套件中,我可以很容易地测试我收到Option.empty[Orange] 的情况,期望它是shouldBe None。但是,当我想测试返回的 ApplesNotSupported 案例类时,我确实遇到了问题。既然我们希望“失败”发生,我如何期望这种“失败”会承认测试通过?每当我尝试运行我的场景时,我都会收到错误消息:

Validation is not success ApplesNotSupported(orderNumber)

尝试使用interrupt 并不能解决问题,因为它不是例外,我们也不想故意fail 进行测试。使用scalazScalaTest 会不会有问题?

我对函数式编程和 Scala 编程还是很陌生,所以任何资源或建议都会有所帮助,因为我在搜索文档时遇到了麻烦。

【问题讨论】:

    标签: scala functional-programming scalatest


    【解决方案1】:

    您可能希望在测试析取时考虑使用析取匹配器: 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中的一样。

    【讨论】:

    • 感谢您与参考一起指出。我没有想到我们也应该使用析取来进行测试,并且过于专注于只看到最终结果。
    【解决方案2】:

    如何将其包装在 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)
      }
    }
    

    【讨论】:

    【解决方案3】:

    我对 scalaz 或析取都不熟悉,但听起来 scalatest 断言 (http://www.scalatest.org/user_guide/using_assertions) 中的拦截功能可能会有所帮助。

    您使用 intercept 定义您期望的异常类型,然后运行将在函数中引发异常的代码。您可以将 intercept 的结果分配给 val,然后您可以使用 assertassertResult 将其与预期值进行比较> 来自scalatest。

    希望这能有所帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2018-11-21
      • 2018-12-20
      相关资源
      最近更新 更多