वर्तमान में एक grails 1.3.7 ऐप को 2.1.0 में अपग्रेड करना और फ़िल्टर का एक सेट है जिसे मैं परीक्षण करना चाहता हूं। grails documentation for testing filters के रूप में देखकर पता चलता है कि फ़िल्टर के लिए यूनिट परीक्षण अब समर्थित है (/ अनुशंसित है? इसका कार्यात्मक भाग में उल्लेख किया गया है लेकिन उदाहरण नहीं ढूंढ रहा है), मैं फ़िल्टर के लिए यूनिट परीक्षणों में कुछ मौजूदा एकीकरण परीक्षणों को परिवर्तित करने का प्रयास कर रहा हूं।Grails 2.0 यूनिट-परीक्षण फ़िल्टर: सेवा इंजेक्शन और निर्भर करता है
हालांकि, मैं फ़िल्टर को इंजेक्शन देने वाले service
एस के लिए कम से कम ठीक से एक नकली लागू करने के लिए इस फ़िल्टर dependsOn
/फ़िल्टर पर एक फ़िल्टर को ठीक से 'नकली दूर' करने के लिए संघर्ष कर रहा हूं।
package com.example
import ... // excluded for brevity
class MyFilters {
GrailsApplication grailsApplication
SomeService someService
def dependsOn = [MyOtherFilters]
def filters = {
all(controller: 'controllerToExclude', invert: true) {
before = {
if (grailsApplication.config.someConfigProperty) {
def someProperty = request.getAttribute('MY_ATTRIBUTE')
if (someProperty = someService.someMethod()) {
redirect(url: someService.getNewUrl(session))
return false
}
}
return true
}
}
}
}
और अन्य फिल्टर:
package com.example
class MyOtherFilters {
SomeOtherService someOtherService
def filters = {
all(controller: '*', action: '*') {
before = {
def foo
if (params[MY_ATTRIBUTE]) {
foo = params[MY_ATTRIBUTE]
someOtherService.setMyAttribute(sitePreference, request)
}
if (!foo) {
foo = someOtherService.getMyAttribute(request)
}
if (foo) {
request.setAttribute('MY_ATTRIBUTE', foo)
}
return true
}
}
}
}
यह एक सच में कंकाल सरलीकृत दो फिल्टर के साथ मैं काम कर रहा हूँ के संस्करण (अगर कोई उत्सुक है, वे एक मोबाइल बनाम डेस्कटॉप वरीयता पढ़ा जाता है और उसके बाद से फिल्टर उस वरीयता के आधार पर)।
तो परीक्षण मैं लिख रहा हूँ इस तरह मोटे तौर पर दिखता है: इस कोड को खड़ा
package com.example
import grails.test.mixin.TestFor // ... etc more imports here
@TestFor(SomeController)
@Mock(MyFilters) // TODO what goes here???
class MyFiltersTests {
static final IPAD_USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X; en-us) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3'
static final NON_MOBILE_USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.12011-10-16 20:23:00'
void testFilterRedirects() {
grailsApplication.config.someConfigProperty = true
// actual filter logic acts on this user-agent through some service calls, would like to mock it out though
request.addHeader("user-agent", IPAD_USER_AGENT)
def result
withFilters(action: "index") {
result = controller.index()
}
//assertSomething on result perhaps
assertEquals "myExpectedRedirectUrl", response.redirectedUrl
}
}
रूप में, यह भी MyFilters
कोड निष्पादित नहीं करता है।
@Mock([MyFilters, MyOtherFilters])
लेकिन तब मैं SomeOtherService
तरीकों नहीं परिभाषित किया जा रहा के साथ समस्याओं में चलाने, और ठीक से उन तरीकों बाहर उपहास करने के लिए एक तरह से नहीं मिला है (मैं कैसे करना है: मैं मजाक आला करने के लिए निर्भर फ़िल्टर जोड़ने की कोशिश की है एक फ़िल्टर पर सर्विस मैक्स सेट करें? नियंत्रक या सेवा पर आप def myMock = mockFor(SomeOtherService)
कर सकते हैं और फिर controller.someOtherService = myMock.createMock()
या इस तरह के कुछ कर सकते हैं, लेकिन मुझे इस withFilters
ब्लॉक के साथ फ़िल्टर के लिए सेवा सेट करने का कोई तरीका नहीं मिल रहा है, दस्तावेज़ीकरण उपयोग करने का सुझाव दे रहा है
आदर्श रूप में, मैं someService
और MyOtherFilters
के साथ कुछ भी करने के लिए मजाक कर रहा हूं, और बस मुझे लिख रहा हूं इस फ़िल्टर पर परीक्षण करें, लेकिन यह सुनिश्चित न करें कि संभव डब्ल्यू/परीक्षण फ़िल्टर क्या है।
किसी भी अंतर्दृष्टि की सराहना की जाएगी, बहुत धन्यवाद यदि आपने इसे अभी तक बनाया है!