2017-04-21 95 views
0

通过测试正与FeatureSpec当使用scenario,我有我的代码,发送一个“失败”情况下类(即ApplesNotAllowed)并且经由scalaz脱节使用一部分。ScalaTest:标记的场景的测试作为预期故障

简单的例子:

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

在我的测试套件,我可以很容易地测试的情况下,我用期待它shouldBe None收到Option.empty[Orange]。但是,当我要测试返回的ApplesNotSupported案例类时,我遇到了一个问题。自从我们希望发生“失败”以来,我会如何期待这种“失败”会承认测试已经过去?每当我尝试运行我的方案,我得到的错误:

Validation is not success ApplesNotSupported(orderNumber) 

使用interrupt不能解决问题,因为它不是一个例外试过了,也不希望去刻意fail测试。这可能是使用scalazScalaTest的问题吗?

我对于Scala中的函数式编程和编程总的来说还是比较新的,所以任何资源或建议都会有所帮助,因为我在搜索文档时遇到问题。 https://github.com/typelevel/scalaz-scalatest/blob/master/src/main/scala/DisjunctionMatchers.scala

这是基于一个脱节的结果,测试的最佳方式:

回答

4

您可能希望寻找到使用脱节测试析取匹配器时。 可以匹配基础上的脱节本身:

must be_\/- 
must be_-\/ 

或进一步与对手走了一步上的脱节,它包含的值的结果:

must be_\/-(value) 
must be_-\/(value) 

我不亲自使用ScalaTest ,但它看起来应该与specs2中的相同。

+0

感谢它指向了与基准一起。在我看来,我们不应该使用不连续性来进行测试,并且过于专注于看到最终结果。 – abhi

0

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

您可以用拦截定义您期望的异常类型,然后运行将在该函数内抛出异常的代码。您可以拦截的结果分配给一个VAL,然后你可以比较使用断言assertResult从scalatest预期值。

希望这可以帮助! :)

1

怎么样在尝试包裹它,做这样的事情:

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) 
    } 
} 
+0

通过析取,您可以对结果进行模式匹配,避免不必要的例外。这正是匹配器在执行时所做的分析:https://github.com/typelevel/scalaz-scalatest/blob/master/src/main/scala/DisjunctionMatchers.scala#L30-L38 – Charles