मैं सामान्य शब्दों आप पहले से ही तथ्य यह है कि सबसे अच्छा तरीका प्रतिक्रिया उपहास करने के लिए है पर पहुंच जाते हैं में लगता है:
यहाँ समारोह क्या करता है कि मैं परीक्षण करना चाहते हैं की एक सरल उदाहरण है। स्काला में, इस स्काला नकली http://scalamock.org/
का उपयोग कर आप अपने कोड की व्यवस्था तो किया जा सकता है ताकि akka.http.scaladsl.HttpExt
के अपने उदाहरण निर्भरता कोड है जो इसे इस्तेमाल करता है में इंजेक्ट किया जाता है (जैसे एक निर्माता पैरामीटर के रूप में), तो परीक्षण के दौरान आप एक इंजेक्षन कर सकते हैं Http
का उपयोग करके निर्मित एक के बजाय mock[HttpExt]
का उदाहरण लागू करें।
संपादित करें: मुझे लगता है कि यह पर्याप्त विशिष्ट नहीं होने के कारण मतदान किया गया था। यहां बताया गया है कि मैं आपके परिदृश्य की नकल कैसे करूंगा। यह सभी implicitis द्वारा थोड़ा और जटिल बना दिया गया है।
main
में कोड:
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{Uri, HttpResponse, HttpRequest}
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.ActorMaterializer
import scala.concurrent.{ExecutionContext, Future}
trait S3BucketTrait {
type HttpResponder = HttpRequest => Future[HttpResponse]
def responder: HttpResponder
implicit def actorSystem: ActorSystem
implicit def actorMaterializer: ActorMaterializer
implicit def ec: ExecutionContext
def sampleTextFile(uri: Uri): Future[String] = {
val responseF = responder(HttpRequest(uri = uri))
responseF.flatMap { response => Unmarshal(response.entity).to[String] }
}
}
class S3Bucket(implicit val actorSystem: ActorSystem, val actorMaterializer: ActorMaterializer) extends S3BucketTrait {
override val ec: ExecutionContext = actorSystem.dispatcher
override def responder = Http().singleRequest(_)
}
test
में कोड:
import akka.actor.ActorSystem
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer
import akka.testkit.TestKit
import org.scalatest.{BeforeAndAfterAll, WordSpecLike, Matchers}
import org.scalamock.scalatest.MockFactory
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.Future
class S3BucketSpec extends TestKit(ActorSystem("S3BucketSpec"))
with WordSpecLike with Matchers with MockFactory with BeforeAndAfterAll {
class MockS3Bucket(reqRespPairs: Seq[(Uri, String)]) extends S3BucketTrait{
override implicit val actorSystem = system
override implicit val ec = actorSystem.dispatcher
override implicit val actorMaterializer = ActorMaterializer()(system)
val mock = mockFunction[HttpRequest, Future[HttpResponse]]
override val responder: HttpResponder = mock
reqRespPairs.foreach{
case (uri, respString) =>
val req = HttpRequest(HttpMethods.GET, uri)
val resp = HttpResponse(status = StatusCodes.OK, entity = respString)
mock.expects(req).returning(Future.successful(resp))
}
}
"S3Bucket" should {
"Marshall responses to Strings" in {
val mock = new MockS3Bucket(Seq((Uri("http://example.com/1"), "Response 1"), (Uri("http://example.com/2"), "Response 2")))
Await.result(mock.sampleTextFile("http://example.com/1"), 1 second) should be ("Response 1")
Await.result(mock.sampleTextFile("http://example.com/2"), 1 second) should be ("Response 2")
}
}
override def afterAll(): Unit = {
val termination = system.terminate()
Await.ready(termination, Duration.Inf)
}
}
build.sbt
निर्भरता:
libraryDependencies += "com.typesafe.akka" % "akka-http-experimental_2.11" % "2.0.1"
libraryDependencies += "org.scalamock" %% "scalamock-scalatest-support" % "3.2" % "test"
libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.6"
libraryDependencies += "com.typesafe.akka" % "akka-testkit_2.11" % "2.4.1"
मैंने कभी इसका इस्तेमाल नहीं किया, लेकिन यह स्प्रे टेस्टकिट की तरह दिखता है: https://github.com/theiterators/akka-http-microservice/blob/master/src/test/scala/ServiceSpec.scala। स्प्रे में आपको अक्का लाने की ज़रूरत नहीं है और सीधे मार्ग के खिलाफ परीक्षण कर सकते हैं (यह एक पीएफ है)। –
क्या आप 'freeGeoIpConnectionFlow' का जिक्र कर रहे हैं? मुझे लगता है कि मैं यहाँ कुछ याद कर रहा हूँ। मैं देख सकता हूं कि यह [AkkaHttpMicroservice] में परिभाषा को ओवरराइड कर रहा है (https://github.com/theiterators/akka-http-microservice/blob/9ff6bdb67f9665817935ffe7107682e04056fa76/src/main/scala/AkkaHttpMicroservice.scala) लेकिन यह कैसे कहा जाता है 'सर्विसस्पेक' में? ऐसा लगता है कि बाइंडिंग प्राप्त करने के लिए आपको 'AkkaHttpMicroservice.apply()' को कॉल करने की आवश्यकता है। – Steiny
स्प्रे/अक्काहट में रीस्ट एपीआई का परीक्षण करने के 2 तरीके हैं: 1) स्टार्टअप अभिनेता सिस्टम के रूप में आप पूरे एप्लिकेशन को चलाएंगे, इसे http क्लाइंट के साथ परीक्षण करें, इसे बंद करें; 2) डीएसएल को रूट करने के खिलाफ परीक्षण जो अनिवार्य रूप से एक पीएफ है और उसे चलाने के लिए अभिनेता सिस्टम की आवश्यकता नहीं है। मैं दूसरे विकल्प के बाद हूं क्योंकि यह अधिक हल्का और यूनिट टेस्ट बनाम एकीकरण परीक्षण (1) की तरह है। इस मामले में हमें नेटवर्क इंटरफ़ेस से जुड़ना नहीं होगा और मार्ग को संभालने के लिए कोई अभिनेता शुरू करने की आवश्यकता नहीं है, जब तक कि आप कहीं और कलाकारों का उपयोग न करें। स्प्रे अनुभव से बोलते हुए मैंने कभी AkkaHttp पर यह कोशिश नहीं की। –