में कस्टम कोडेक का उपयोग कैसे करें 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")
दूसरा एक इकाई परीक्षण के बजाय एक एकीकरण परीक्षण का उपयोग करें: सबसे पहले, परीक्षण से सीधे कोडेक कहते हैं।
परिणाम प्रत्येक विकल्प के लिए समान थे। मुझे याद आ रही छोटी सी चीज क्या है?
आपके समय के लिए अग्रिम धन्यवाद!
धन्यवाद hvgotcodes। तो क्या मैं grails-app/utils के तहत एक रैसेट्रैक निर्देशिका बनाउंगा, और मेरे कोडेक की शुरुआत में "पैकेज रैसेट्रैक" जोड़ूंगा? मेरे पास अभी तक एक आईडी संपादक स्थापित नहीं है, बस समय के लिए एक टेक्स्ट एडिटर का उपयोग कर। – BenjaminDWest
@benjamindwest, हाँ, आपको मैन्युअल रूप से पैकेज संरचना बनाना होगा। तो पूर्व-मौजूदा grails-app/utils के तहत कॉम/रैसेट्रैक/सुरक्षा/कोडेक्स की तरह कुछ। फिर पैकेज com.racetrack.security.codecs है, और आप com.racetrack.security.codecs आयात करेंगे। HACodec – hvgotcodes
बहुत बहुत धन्यवाद। इसने मेरे मुद्दे को हल किया। – BenjaminDWest