2011-03-11 10 views
5

में कस्टम कोडेक का उपयोग कैसे करें I InfoQ से Grails ट्यूटोरियल के माध्यम से काम कर रहा हूं जिसे ग्रिल्स, द्वितीय संस्करण के साथ प्रारंभ करना कहा जाता है, और मैं एक इकाई परीक्षण में कस्टम कोडेक जोड़ने की कोशिश कर रहा हूं। मेरा पर्यावरण Grails 1.3.7 और ग्रोवी 1.7.8 है।Grails यूनिट परीक्षण

तो कोडेक SHACodec.groovy है, और यह grails-app/utils में रहता है। सामग्री हैं:

import java.security.MessageDigest 

class SHACodec{ 
    static encode = {target-> 
    MessageDigest md = MessageDigest.getInstance('SHA') 
    md.update(target.getBytes('UTF-8')) 
    return new String(md.digest()).encodeAsBase64()  
    }  
} 

जब मैं ऐप में लॉग इन करता हूं तो कोडेक ठीक काम करता है। यह मेरी UserController.authenticate() में एक पासवर्ड क्षेत्र के लिए इस्तेमाल किया जा रहा

def authenticate = { 
    def user = 
      User.findByLoginAndPassword(params.login, params.password.encodeAsSHA()) 
     if(user){ 
     session.user = user 
      flash.message = "Hello ${user.login}!" 
     redirect(controller:"race", action:"list")  
     }else{ 
     flash.message = "Sorry, ${params.login}. Please try again." 
      redirect(action:"login") 
    }   
    } 

जब मैं एक इकाई परीक्षण, निम्न त्रुटि प्रदर्शित करता है से जोड़ें: वर्ग के लिए SHACodec:

ऐसा कोई संपत्ति racetrack.UserControllerTests groovy.lang.MissingPropertyException: ऐसा कोई संपत्ति: SHACodec वर्ग के लिए: racetrack.UserControllerTests racetrack.UserControllerTests.testAuthenticate पर (UserControllerTests.groovy: 39)

परीक्षा है:

package racetrack 

import org.codehaus.groovy.grails.plugins.codecs.* 
import grails.test.* 

class UserControllerTests extends ControllerUnitTestCase { 
    protected void setUp() { 
     super.setUp() 

     String.metaClass.encodeAsSHA = {-> 
      SHACodec.encode(delegate) 
     } 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

void testAuthenticate(){ 

    def jdoe = new User(login:"jdoe", password:"password".encodeAsSHA()) 
    mockDomain(User, [jdoe]) 

    controller.params.login = "jdoe" 
    controller.params.password = "password" 
    controller.authenticate() 
    assertNotNull controller.session.user 
    assertEquals "jdoe", controller.session.user.login 

    controller.params.password = "foo" 
    controller.authenticate() 
    assertTrue controller.flash.message.startsWith( 
    "Sorry, jdoe")  
} 

मैं अब तक दो अलग-अलग सिफारिशें मिल गया। ,

SHACodec codec = new SHACodec() 
codec.encode("password") 

दूसरा एक इकाई परीक्षण के बजाय एक एकीकरण परीक्षण का उपयोग करें: सबसे पहले, परीक्षण से सीधे कोडेक कहते हैं।

परिणाम प्रत्येक विकल्प के लिए समान थे। मुझे याद आ रही छोटी सी चीज क्या है?

आपके समय के लिए अग्रिम धन्यवाद!

उत्तर

2

आप अपना कोडेक आयात नहीं कर रहे हैं - आप डिफ़ॉल्ट grails कोडेक्स आयात कर रहे हैं। आपको कोडेक के कोडेक के रहने के सटीक पैकेज पथ से टेस्ट मैच में कोडेक के लिए आयात करने की आवश्यकता है। यदि आप आईडीई का उपयोग कर रहे हैं, तो इसे आपके लिए कोडेक आयात करने का प्रयास करें ...

+0

धन्यवाद hvgotcodes। तो क्या मैं grails-app/utils के तहत एक रैसेट्रैक निर्देशिका बनाउंगा, और मेरे कोडेक की शुरुआत में "पैकेज रैसेट्रैक" जोड़ूंगा? मेरे पास अभी तक एक आईडी संपादक स्थापित नहीं है, बस समय के लिए एक टेक्स्ट एडिटर का उपयोग कर। – BenjaminDWest

+1

@benjamindwest, हाँ, आपको मैन्युअल रूप से पैकेज संरचना बनाना होगा। तो पूर्व-मौजूदा grails-app/utils के तहत कॉम/रैसेट्रैक/सुरक्षा/कोडेक्स की तरह कुछ। फिर पैकेज com.racetrack.security.codecs है, और आप com.racetrack.security.codecs आयात करेंगे। HACodec – hvgotcodes

+0

बहुत बहुत धन्यवाद। इसने मेरे मुद्दे को हल किया। – BenjaminDWest

1

GrailsUnitTestCase के loadCodec विधि का उपयोग करें। यह बहुत सरल है। उदाहरण bellow देखें:

import grails.test.* 
import org.codehaus.groovy.grails.plugins.codecs.HTMLCodec 

class SomeTests extends GrailsUnitTestCase { 
    protected void setUp() { 
     super.setUp() 
     loadCodec(HTMLCodec) 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomething() { 
     assertEquals "&lt;p&gt;Hello World&lt;/p&gt;", "<p>Hello World</p>".encodeAsHTML() 
    } 
} 
0

@hvgotcodes से जवाब सही है, लेकिन आप भी (आयात काम करता है से पहले अपने जावा पथ का निर्माण करने के grails एप्लिकेशन के अंतर्गत/utils फ़ोल्डर जोड़ने की जरूरत कम से कम है कि मैं क्या करने की जरूरत है कि स्प्रिंगसोर्स ग्रहण आईडीई के साथ करें)।

संबंधित मुद्दे