2016-02-23 3 views
2

Я пытаюсь написать тест, который просто проверяет, чтобы установить правильную базу данных, но утверждение никогда не срабатывает, и все заканчивается успешно (хотя оно должно сбой):Асинхронное утверждение не запускается в scalatest

import anorm._ 
import org.scalatestplus.play._ 
import play.api.db.DB 

class Housekeeping extends PlaySpec with OneServerPerSuite { 

    // Make sure the test database is loaded 
    "test connection to test database" in { 

     DB.withConnection { implicit connection => 
      SQL("SELECT * FROM accounts WHERE ID = 1").withResult(res => { 
       val row = res.head.row 
       val name = row.asMap("accounts.name") 
       println(name)    // Prints to console 
       name mustEqual "this should fail" 
       println("HERE")    // Never prints to console 
      }) 
     } 
    } 
} 

консоли:

[info] Housekeeping: 
[info] - application - Creating Pool for datasource 'default' 
tyler 
[info] - test connection to test database 
[info] - application - Shutting down connection pool. 

Я не уверен, почему ничего не происходит, так как я получаю имя штраф от йа tabase. Я не мог найти документацию о выполнении асинхронных тестов, которые, я думаю, могут быть частью проблемы.

ответ

3

Что-то вроде this может помочь:

import org.scalatest._ 
import concurrent.AsyncAssertions 

import anorm._ 
import org.scalatestplus.play._ 
import play.api.db.DB 

class Housekeeping extends PlaySpec with OneServerPerSuite with AsyncAssertions { 

    // Make sure the test database is loaded 
    "test connection to test database" in { 
     val w = new Waiter 
     DB.withConnection { implicit connection => 
      SQL("SELECT * FROM accounts WHERE ID = 1").withResult(res => { 
       val row = res.head.row 
       val name = row.asMap("accounts.name") 
       println(name)    // Prints to console 
       w { name mustEqual "this should fail" } 
       w.dismiss() 
       println("HERE")    
      }) 
     } 
     w.await() 
    } 
} 

Ваша проблема в том, что scalatest не получил исключение запускаемое mustEqual, как это было брошено асинхронно.

Практически Waiter является своего рода обертку вокруг Promise (так что вы должны сделать dismiss() для того, чтобы завершить его) и w.await() просто ждет его и перенаправляет исключение из w{...} нити в scalatest в.

+0

Удивительный, это именно то, что я искал – Tyler