Cara menggunakan akhirnya dengan Specs2RouteTest

Ada dua spesifikasi di sini. Yang pertama tidak lewat karena eventually di check tidak akan menyebabkan seluruh rute diputar ulang tetapi ini adalah cara yang saya lebih suka ikuti. Spesifikasi kedua adalah solusi terbaik yang saya temukan (dan membuktikan bahwa itu bisa dilakukan;)) tetapi berisi beberapa boilerplate seperti fungsi tambahan yang dalam kehidupan nyata harus mengembalikan tuple daripada satu hal dan itu tidak konsisten dengan desain sintaks tes semprot untuk menguji rute.

Jadi pertanyaannya adalah: Cara menggunakan eventually dengan tes semprot agar sedekat mungkin dengan sintaksis dari spesifikasi pertama.

import org.specs2.mutable.Specification
import spray.routing.Directives
import spray.http._
import MediaTypes._
import HttpCharsets._
import spray.testkit.Specs2RouteTest

class EventuallyAndRouts extends Specification with Directives with Specs2RouteTest {

    var i = 0
    def incAndGet = {
        i = i + 1
        println(s"This is i = $i")
        s"$i"
    }

    "The testing infrastructure should support an eventually matcher" >> {
        "but it is not working inside a check as I need :( (and this will fail)" in {
            i = 0
            Get() ~> complete(incAndGet) ~> check {
                body must eventually(7, 20 millis)(be_===(HttpEntity(ContentType(`text/plain`, `UTF-8`), "5")))
            }
        }
        "so I got workaround :/ (and this is passing)" in {
            i = 0
            def requestResult = Get() ~> complete(incAndGet) ~> check {
                body
            }
            requestResult must eventually(7, 20 millis)(be_===(HttpEntity(ContentType(`text/plain`, `UTF-8`), "5")))
        }
    }

}

person panurg    schedule 26.11.2014    source sumber


Jawaban (1)


eventually digunakan untuk mengevaluasi berulang kali suatu nilai yang berubah. Jadi itu harus berupa parameter var, def atau nama panggilan.

Cara terbaik untuk mengatasinya mungkin adalah dengan menerapkan metode checkEventually(times, delay) yang akan menggabungkan panggilan eventually. Sesuatu seperti itu:

implicit class Checked(request: =>Request) {
  def checkEventually[R : AsResult](times: Int, delay: Duration, matcher: Matcher[RequestResult])(body: =>Unit)( = {
    val requestResult = result ~> check(body)
    requestResult must eventually(times, delay)(matcher)
  }
}
person Eric    schedule 26.11.2014
comment
Saya telah menulis sesuatu yang serupa berdasarkan saran Anda (saya telah menghilangkan deklarasi implisit dan kelas serta menambahkan metode ke kelas spesifikasi) dan saya perhatikan bahwa memanggil: result ~› check(body) tidak akan menyebabkan pemutaran ulang rute. Itu hanya memeriksa beberapa kali hasil yang sama. - person panurg; 27.11.2014
comment
Saya tidak paham dengan perutean semprotan, tetapi ya, Anda perlu menjalankan fungsi yang akan menjalankan permintaan lagi. Perhatikan bahwa saya menggunakan parameter byname di kelas implisit untuk efek tersebut. Mungkin Anda harus bertanya di milis semprot apakah ada? - person Eric; 28.11.2014