2016-09-24 2 views
0

필자는 모델을 가지고 시작하기 전에 테스트를 작성했습니다. 이제 내 문제는 : 기능이 작동하는 동안, 내 테스트는 비 결정적입니다. 대개 그들은 일하지만 때로는 그렇지 않습니다. 나는 그것 때문에 Future어설 션하기 전에 인서트 완료를 기다리는 중

의의 가정하지만이 전 예는 무엇을 의미하는 당신을 보여 드리죠 : 가끔 시간에 db.run(setup) 완료를 가정

before { 
    db.run(animals.createTable) 
    } 

    after { 
    db.run(animals.dropTable) 
    } 

    "An animal" must "have a unique id" in 
    { 
    val setup = DBIO.seq(
     animals.insert(Animal("Ape")), 
     animals.insert(Animal("Dog")) 
    ) 

    db.run(setup) 


    val result = db.run(animals.tableQuery.result).futureValue 
    result shouldBe a[Seq[_]] 
    result distinct.length shouldEqual 2 
    result(0).id should not equal result(1).id 
    } 

하지만, 경우에 따라서는, 그러므로 나는 다음 AssertionException "을하지 않습니다 예상 길이는 2, 실제 0 "입니다. 말했듯이, 나에게 이것은 "경쟁 조건"처럼 보입니다 (나는 이것이 올바른 종단이 아니라는 것을 알고 있습니다)).

Await.ready(db.run(setup), Duration.Inf)

하지만 그 일을 변경하지 않습니다

그럼, 내가 노력하는 것은 단순히과 같이 삽입 문의 결과를 기다리고 있었다. 왜 그런가요? 누군가 Await이 여기에 막히지 않는 이유를 누군가에게 설명 할 수 있습니까? 필자는 이것을 차단하고 인서트가 실행되었을 때 실행되는 줄만 실행한다고 가정했습니다.

또한 .onComplete 블록에서 어설 션을 래핑하려고했지만 행운도 없습니다.

나를위한 힌트가 있습니까?

+0

결과를 기다리는 데 'futureValue's가 지시하는'IntegrationPatience' 특성을 혼합 해보십시오. 그러나 무한 지속 시간을 가진'Await'가 트릭을하지 않는다면 로직 문제처럼 보입니다. 왜냐하면 지속 시간이 무한대라면 작업이 끝나지 않으면 다음 라인은 실행되지 않기 때문입니다. 예외가 없는지 확인하기 위해'Await.ready (db.run (setup) .recover {case t => println (t)}, Duration.inf)'를 시도해 볼 수도 있습니다 –

답변

1

비동기이기 때문에 이전의 후크가 완료되지 않은 경우가 있습니다. 나는 당신이 설치 블록과 함께 before 블록에 미래에 Await.ready을 추가하면 문제가 사라질 것이라고 생각합니다.

관련 문제