Specs2 के साथ मॉकिटो का उपयोग करके, मैं उनकी विधि कॉल को सत्यापित करने के लिए सेवाओं का मज़ाक उड़ाता हूं।
मेरा नियंत्रक वसंत द्वारा तत्काल है। इससे मुझे object
के बजाय class
के रूप में इलाज करने की अनुमति मिलती है। =>controller
टेस्ट करने योग्य बनाने के लिए आवश्यक है। यहाँ एक उदाहरण:
@Controller
class MyController @Autowired()(val myServices: MyServices) extends Controller
नियंत्रकों के लिए स्प्रिंग सक्षम करने के लिए, आप Play के रूप में, एक Global
वस्तु को परिभाषित करने के लिए है! दस्तावेज बताते हैं:
object Global extends GlobalSettings {
val context = new ClassPathXmlApplicationContext("application-context.xml")
override def getControllerInstance[A](controllerClass: Class[A]): A = {
context.getBean(controllerClass)
}
}
मेरा यूनिट परीक्षण वसंत की आवश्यकता नहीं है; मैं बस कन्स्ट्रक्टर को सहयोगी (मॉक्स) पास करता हूं।
हालांकि, प्रस्तुत टेम्पलेट से संबंधित, मैं केवल परिणाम के प्रकार (ठीक है, BadRequest, पुनर्निर्देशन आदि) के लिए परीक्षण करता हूं। दरअसल, मैंने देखा कि मेरे परीक्षण को पूरे यूनिट परीक्षण के साथ विवरण में पूरे प्रस्तुत किए गए टेम्पलेट को विवरण (इसे भेजे गए पैरामीटर आदि) को स्कैन करने में आसान नहीं है।
इस प्रकार, सही टेम्पलेट को सही तर्क के साथ बुलाया जाने के लिए, मुझे पूरा स्वीकार्य परिणाम स्कैन करने के लिए, यदि आप चाहें तो सेलेनियम या एक संभावित कार्यात्मक परीक्षण चलाने वाले मेरे स्वीकृति परीक्षणों पर भरोसा करते हैं।
2 - सेवाओं से वापसी मान टेम्पलेट
यह that..How के लिए जाँच करने के लिए बहुत आसान है की सही विशेषताओं के लिए पारित कर रहे हैं? संकलक पर भरोसा करके! उदाहरण के लिए सरल प्राइमेटिव्स के बजाय अपने टेम्पलेट में कुछ कस्टम प्रकारों को पास करना पसंद करें: phone: String
बन जाएगा: phone: Phone
। (एक साधारण मूल्य वस्तु)। इसलिए, आपके टेम्पलेट (यूनिट परीक्षण या वास्तविक उत्पादन कोड में) में गैर-अपेक्षित क्रम में विशेषताओं को पारित करने का कोई डर नहीं है। कंपाइलर वास्तव में चेतावनी देगा।
यहां specs2: का उपयोग करके मेरे यूनिट परीक्षण (सरलीकृत) में से एक का उदाहरण है (आप एक रैपर के उपयोग को नोट करेंगे: WithFreshMocks
)। यह case class
परीक्षण के बाद परीक्षण के सभी चर (इस मामले में मोजे) को रीफ्रेश करने की अनुमति देगा। इस प्रकार मैक्स को रीसेट करने का एक अच्छा तरीका है।
सेवा दी:
object Application extends ApplicationController
with ServiceImpl {
def template = views.html.index.apply
}
trait ApplicationController extends Controller
with Service {
def template: (String) => play.api.templates.Html
def index = Action {
Ok(template("controller got:" + indexMessage))
}
}
और:
trait Service {
def indexMessage : String
}
trait ServiceImpl {
def indexMessage = {
"Hello world"
}
}
फिर नियंत्रक की तरह लग रहा
class MyControllerSpec extends Specification with Mockito {
def is =
"listAllCars should retrieve all cars" ! WithFreshMocks().listAllCarsShouldRetrieveAllCars
case class WithFreshMocks() {
val myServicesMock = mock[MyServices]
val myController = new MyController(myServicesMock)
def listAllCarsShouldRetrieveAllCars = {
val FakeGetRequest = FakeRequest() //fakeRequest needed by controller
mockListAllCarsAsReturningSomeCars()
val result = myController.listAllCars(FakeGetRequest).asInstanceOf[PlainResult] //passing fakeRequest to simulate a true request
assertOkResult(result).
and(there was one(myServicesMock).listAllCars()) //verify that there is one and only one call of listAllCars. If listAllCars would take any parameters that you expected to be called, you could have precise them.
}
private def mockListAllCarsAsReturningSomeCars() {
myServicesMock.listAllCars() returns List[Cars](Car("ferrari"), Car("porsche"))
}
private def assertOkResult(result: PlainResult) = result.header.status must_== 200
}
क्यों नहीं उपयोग करने के लिए ScalaCheck/ScalaTest/Specs2 0? विशेष रूप से, कैसे आप एक परीक्षण लेखक है – 4lex1v
सेवा और टेम्पलेट के लिए कॉल करने के लिए कॉल अवरोधन करने specs2.0 का उपयोग कर? उदाहरण मैं एक पूरी (एकीकृत) –