2016-09-24 80 views
0

我有一个模型并在开始之前编写测试。现在我的问题是:当功能正常时,我的测试是非确定性的。大多数时候他们工作,但有时他们不工作。我想这是因为Future在声明之前等待插入完成

但是,让我们告诉你我举例的意思是:

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 
    } 

我有时会认为在时间上db.run(setup)完成,但有时没有,所以我再得到一个AssertionException“预期长度为2,实际为0“。如上所述,对我来说,这里看起来像是一个“竞争条件”(我知道这不是正确的终点;))。

所以,我试过只是等待插入语句的结果就像这样:

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

但是,这并不改变任何事情。那为什么呢?有人可以向我解释为什么Await不会在这里阻塞?我认为这是为了阻止并且只执行插入后执行的行。

我也试过在.onComplete - 块包裹的说法,但没有运气无论是。

我任何提示?

+0

你应该尝试在'IntegrationPatience'特质它指示'futureValue's等待更长时间的结果混合。但是,如果'等待无限持续时间并不能解决问题,那么它就像是一个逻辑问题,因为当持续时间无限时,除非操作完成,否则下一行将不会执行。你也可以尝试做'Await.ready(db.run(setup).recover {case t => println(t)},Duration.inf)'以确保没有任何异常 –

回答

1

我怀疑你的问题是,有时你的前钩尚未完成要么,因为它也是异步。我会怀疑,如果你在前面的块中添加一个Await.ready以及你的未来,那么问题就会消失。