2017-04-21 45 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