Асинхронное утверждение не запускается в

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

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.

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

1 ответ

Решение

Нечто подобное может помочь:

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()
    }
}

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

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

Другие вопросы по тегам