2017-04-21 6 views
0

같은 시나리오 테스트를 표시, 나는 "실패"케이스 클래스 (즉 ApplesNotAllowed) 보내고 scalaz 분리를 통해 사용됩니다 내 코드의 일부를 가지고있다.ScalaTest는 : <code>FeatureSpec</code>과 테스트를 통해 작업 및 <code>scenario</code> 사용하는 경우 예상 실패

빠른 예 : 나는 그것을 shouldBe None 것을 예상하여 Option.empty[Orange]을받을 경우 내 테스트 스위트에서

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

, 나는 쉽게 사건을 테스트 할 수 있습니다. 그러나 ApplesNotSupported 사례 클래스가 반환되는지 테스트하려고 할 때 문제가 발생합니다. 우리가 "실패"를 원하기 때문에 통과 한 것으로 인정할이 "실패"를 어떻게 기대합니까? 내 시나리오를 실행하려고 할 때마다, 나는 오류가 발생합니다 :

에 예외가 아니므로 문제가 해결되지 않는 interrupt를 사용하여 시도
Validation is not success ApplesNotSupported(orderNumber) 

않으며 우리가 의도적으로 fail 시험에 싶어. scalazScalaTest을 사용할 때 문제가 될 수 있습니까?

전반적인 스칼라에서 함수형 프로그래밍과 프로그래밍에 대해 상당히 새롭기 때문에 문서를 찾는 데 문제가 있으므로 모든 리소스 나 제안이 도움이됩니다. https://github.com/typelevel/scalaz-scalatest/blob/master/src/main/scala/DisjunctionMatchers.scala

이는 분리의 결과에 따라 테스트하는 가장 좋은 방법입니다 : disjunctions을 테스트 할 때 당신은 분리를 사용하여에보고 할 수 있습니다

답변

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)에있는 차단 기능이 도움이 될 것 같습니다.

인터셉트으로 예상되는 예외 유형을 정의하고 함수 내에서 예외를 throw 할 코드를 실행합니다. 그런 다음 어설 또는 scalatest에서 assertResult를 사용하여 기대 값을 비교할 수있는 차단의 결과를 할당 할 수 있습니다.

희망이 도움이 될 수 있습니다! :)

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

불일치가 있으면 결과에 패턴 일치만으로 불필요한 예외가 발생하는 것을 피할 수 있습니다.이것은 분리 실행 matchers가 구현에서하는 것과 정확히 같습니다. https://github.com/typelevel/scalaz-scalatest/blob/master/src/main/scala/DisjunctionMatchers.scala#L30-L38 – Charles