2013-09-05 11 views
10

मैं विधिस्पॉक का उपयोग कर Grails सेवा का परीक्षण कैसे करें?

class EncouragementService { 
    def stripePaymentService 

    def encourageUsers(List<User> users){ 
    if(null != users && users.size()>0){ 
     for(User user : users){ 
     //logic 
     stripePaymentService.encourage(user) 
     // 
     } 
    } 
    } 
    } 

निम्नलिखित जावा ब्रह्मांड में कोड ऊपर का परीक्षण करने के लिए, मैं पहली बार सेटअप में दो या तीन उपयोगकर्ताओं को बनाने हैं JUnit का उपयोग कर के साथ एक EncouragementService.groovy है। उपयोगकर्ताओं की सूची encourageUsers(...) विधि पर पास करें और परिणाम के साथ जो कुछ भी मैं चाहता हूं उसे जांचें।

मैं कैसे grails में यहाँ एक ही बात को प्राप्त कर सकते,

import com.github.jmkgreen.morphia.Datastore; 

@TestFor(EncouragementService) 
class EncouragementServiceSpec { 

    def morphiaService = new MorphiaService() 

    void testEncourageUsers() { 
     List<User> users = createUsers(); 
     encouragementService.(users) 
      // 
    } 

    def createUsers(){ 
     Datastore datastore = morphiaService.dataStoreInstance() 
     def user = new User() 
     user.setName("Prayag Upd") 
     // 
     datastore.save(user) 
     [user] 
    } 
} 

मैं उन का निर्माण करने के spock:0.7

plugins { 
    test(":spock:0.7") { exclude "spock-grails-support" } 
} 

उत्तर

13

सेवा वर्ग के रूप में नीचे अनुकूलित किया जा सकता है:

class EncouragementService { 
    def encourageUsers(List<User> users){ 
     if(users){ //Groovy truth takes care of all the checks 
      for(user in users){ 
      //logic 
      } 
     } 
    } 
} 

स्पॉक यूनिट टेस्ट:
स्पॉक पूरी अन्य स्तर, (BDD का पालन करता है) जहां व्यवहार का परीक्षण कर सकते हैं करने के लिए परीक्षण लेता है। परीक्षण वर्ग लगेगा जैसे:

import spock.lang.* 

@TestFor(EncouragementService) 
@Mock(User) //If you are accessing User domain object. 
class EncouragementServiceSpec extends Specification{ 
    //def encouragementService //DO NOT NEED: mocked in @TestFor annotation 

    void "test Encourage Users are properly handled"() { 
     given: "List of Users" 
      List<User> users = createUsers() 

     when: "service is called" 
      //"service" represents the grails service you are testing for 
      service.encourageUsers(users) 

     then: "Expect something to happen" 
      //Assertion goes here 
    } 

    private def createUsers(){ 
     return users //List<User> 
    } 
} 
+0

"धैर्य" [मेरा नाम] है (http://www.ask.com/question/what-is-the-meaning-of-the-name- धीरज), मैं मजाक नहीं कर रहा हूं;)। स्पष्ट रूप से बोलते हुए, हाल ही में मेरे पास एक [प्रेजेंटेशन] था (http://dmahapatro.github.io/bdd-grails-spock-presentation/#/) स्थानीय Grails उपयोगकर्ता समूह में स्पॉक पर, इसलिए मैंने सोचा कि मैं कुछ काम करने के बारे में बताऊंगा पर। ;) @ सेरिजियो मिशेल – dmahapatro

+0

@dmahapatro जब उपयोगकर्ता 'grails-app/domain' आधारित इकाई नहीं है, तो मुझे' विफलता मिलती है: परीक्षण उपयोगकर्ता ठीक तरह से संभाले जाते हैं (np.zazzercode.service.EncouragementServiceSpec) | org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: डोमेन क्लास [वर्ग np.zazzercode.domain.User] जोड़ नहीं सकता है। यह एक डोमेन नहीं है! \t grails.test.mixin.domain.DomainClassUnitTestMixin.registerGrailsDomainClass पर (DomainClassUnitTestMixin.groovy: 209) ' – prayagupd

+0

@PrayagUpd हां, यदि उपयोगकर्ता एक डोमेन वर्ग नहीं है, तो आप की जरूरत नहीं होगी' @ Mock' है कि मैं क्या मतलब जवाब में – dmahapatro

4

उपयोग build-test-data plugin उपयोग कर रहा हूँ।

@TestFor(EncouragementService) 
@Build(User) 
class EncouragementServiceSpec extends Specification { 

    def "encourage users does x"() { 
    given: 
    def users = createUsers(); 

    when: 
    service.encourageUsers(users) 

    then: 
    // assert something 
    } 

    def createUsers(){ 
    [User.build(), User.build(), User.build()] 
    } 
} 

मैंने इसे उचित स्पॉक विनिर्देश बनाने के लिए कोड में कुछ बदलाव भी किए हैं। आपके परीक्षण को विशिष्टता का विस्तार करना है और आप Spock's keywords के साथ स्वयं को परिचित करना चाहते हैं।

+0

[निर्माण-परीक्षण डेटा प्लगइन] (https://github.com/tednaleid/build-test-data) भयानक लग रहा है, लेकिन गैर के लिए काम करने के लिए प्रतीत नहीं होता 'grails-app/डोमेन' आधारित इकाइयां। अपवाद फेंकता है 'org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: डोमेन क्लास [वर्ग np.zazzercode.domain.User] जोड़ नहीं सकता है। यह डोमेन नहीं है – prayagupd

+0

हां, यह केवल डोमेन कक्षाओं के लिए काम कर रहा है। – Nicholas

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