2012-03-13 9 views
7

मैं प्रलेखन के अनुसार एक Grails सेवा के लिए एक इकाई परीक्षण के भीतर एक डोमेन कक्षा के कुछ सरल मजाक करने का प्रयास कर रहा हूं, लेकिन ऐसा लगता है कि यह हमेशा के लिए उन प्रश्नों में काम नहीं कर रहा है वापस शून्य क्या मुझे कुछ आसान याद आ रही है? यहाँ मेरी कोड के प्रासंगिक हिस्सा है, मैं स्पष्टता के लिए वर्ग और परीक्षण विधि के नाम बदल दिया:मॉकडोमेन कॉल फ़िक्स्चर डोमेन डेटा प्रदान नहीं कर रहा है, मुझे क्या याद आ रहा है? Grails 2.0.1

@TestFor(MyService) 
@TestMixin(DomainClassUnitTestMixin) 

class MyServiceTests { 


    void testMyThing() { 
     defineBeans {anotherService(AnotherService)} //My service under test uses another service, unlikely relevant? 

     MyUser.metaClass.isDirty = { //workaround for mockDomain not adding isDirty method. 
      println("dirty check called"); 
     } 

     mockDomain(MyUser, [ 
       [username: "[email protected]", accountType: UserType.STANDARD, id: 1L], 
       [username: "[email protected]", accountType: UserType.STANDARD, id:3L], 
       [username: "[email protected]", accountType: UserType.BUSINESS, id:2L] 
     ]) 

     MyUser user1 = MyUser.get(1); 
     System.out.println("user 1: ${user1}"); // output is 'user 1: null' 

     MyUser user1byName = MyUser.findByUsername("[email protected]"); 
     System.out.println("user 1 by name: ${user1byName}"); // output is 'user 1 by name: null' 

     ... the actual testing stuff which would love to have non null MyUser objects ... 
}   
} 
+0

क्या आपने @Mock (MyUser) जोड़ने का प्रयास किया है? –

+0

@ टॉमस हाँ मैंने किया, कोई प्रभाव नहीं। दस्तावेज को देखते हुए इसे mockDomain() – Peter

उत्तर

11

मैं इसे समझ से बाहर है, और आप लगता है कि मैं इस को देखते हुए मैं पहले ने काट लिया गया है के बारे में सोचा है | यह। समस्या सत्यापन के साथ थी, और Grails के डिफ़ॉल्ट GORM व्यवहार को सहेजने पर डेटा को जारी रखने में चुपचाप विफल रहा() (यदि आपके क्लास सत्यापन त्रुटियों में है तो मैकडोमेन को अपने नकली उदाहरणों के लिए डेटा पास करते समय उपयोग करना चाहिए)। MyUser को एक खाली रिक्त पासवर्ड चाहिए।

बहुत वर्ष पहले मैं अपने आवेदन के लिए मेरे Config.groovy को grails.gorm.failOnError=true जोड़ा तो मैं कभी नहीं अब और इसके बारे में सोचो, लेकिन निश्चित रूप है कि इकाई के लिए में नहीं पढ़ पाने का परीक्षण

मेरी राय में यह है कि के हस्ताक्षर बनाता है mockDomain बहुत नाजुक (और मुझे failOnError = true सेटिंग सेट करने का कोई तरीका नहीं मिला)। मैंने निम्नलिखित में नकली डेटा सेटअप को स्विच किया है, जिसका सटीक परिणाम है, लेकिन यदि आप अपना डेटा गलत तरीके से सेट अप करते हैं तो तत्काल विफलता देता है।

@Mock(MyUser) 
class MyServiceTests { 
    ... 

    void testMyThing() { 
     new MyUser(username: "[email protected]", 
        accountType: UserType.STANDARD, 
        id: 1L).save(failOnError:true) //throws exception because MyUser requires password field to be non blank 
    ... 
    } 
} 
+1

का उपयोग करते समय इसकी आवश्यकता नहीं होनी चाहिए, जब तक मुझे यह नहीं मिला, तब तक मुझे एक ही समस्या के साथ परेशानी हुई। धन्यवाद दोस्त! – elias

+1

मैं "बिल्ड-टेस्ट-डेटा" प्लगइन का उपयोग कर रहा था, और वह एक काम करता था ... लेकिन नया MyUser (...) नहीं था। तो समस्या छेड़छाड़ की तरह थी। बहुत मुश्किल, और इस जवाब में –

+0

मदद मिली इस जवाब ने मुझे एक और घंटे के लिए दीवार के खिलाफ अपने सिर को टक्कर लगी! अच्छा खोज, और मुझे यकीन है कि हम सब कुछ फिर से इसे काट लेंगे। – spikeheap

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