2013-03-06 6 views
7

वर्तमान में एक 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 के साथ कुछ भी करने के लिए मजाक कर रहा हूं, और बस मुझे लिख रहा हूं इस फ़िल्टर पर परीक्षण करें, लेकिन यह सुनिश्चित न करें कि संभव डब्ल्यू/परीक्षण फ़िल्टर क्या है।

किसी भी अंतर्दृष्टि की सराहना की जाएगी, बहुत धन्यवाद यदि आपने इसे अभी तक बनाया है!

उत्तर

2

एक ही समस्या है। वहाँ एक बग Grails Jira में उठाया है http://jira.grails.org/browse/GRAILS-8976

मैं http://delvingintodev.carrclan.us/2012/12/testing-grails-filters-that-use-services.html 'परीक्षण Grails फिल्टर है कि सेवाओं का उपयोग नहीं '

आप मूल रूप से फिल्टर में सेवा का उपयोग करने के रूप में

package xxx.me 

class MyFilters { 
    def filters = { 
     all(controller:'*', action:'*') { 
      before = { 
       applicationContext.getBean(MyService).doSomethingClever() 
      } 
     } 
    } 
} 

इस में इस प्रकार है में समाधान पाया यदि आप इसे यूनिट परीक्षणों में नकल करने में सक्षम होंगे

package xxx.me 

@TestMixin(GrailsUnitTestMixin) 
@Mock(MyFilters) 
class MyFiltersTests { 

    @Test 
    public void testFilter(){ 
     defineBeans { 
      myService(StubbedMyService) 
     } 
     SimpleController controller = mockController(SimpleController); 

     withFilters(controller:"simple" , action:"index"){ 
      controller.index()  
     } 
    } 
} 

class StubbedMyService extends MyService { 
    def doSomethingClever(){ 
    } 
} 
संबंधित मुद्दे