2016-09-24 5 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

私はあなたの問題が非同期でもあるため、前のフックも終了しないことがあると思われます。私はあなたがあなたのセットアップブロックと一緒に前のブロックにあなたの未来にAwait.readyを追加すると、問題はなくなるだろうと思うでしょう。

関連する問題