2013-09-05 21 views
10

mam EncouragementService.groovy z następującą metodęJak przetestować usługę Grails za pomocą Spocka?

class EncouragementService { 
    def stripePaymentService 

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

Aby przetestować powyżej kodu w uniwersum JAVA, używając JUnit Chciałbym najpierw utworzyć dwie lub trzy użytkowników w konfiguracji. Przekaż listę użytkowników do metody encourageUsers(...) i sprawdź, co chcę z wynikiem.

jaki sposób można osiągnąć to samo tutaj w 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] 
    } 
} 

Używam spock:0.7

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

Odpowiedz

13

klasy usługi mogą być optymalizowane jak poniżej:

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

Spock Jednostka Test:
Spock wykonuje testy na całym innym poziomie, gdzie można przetestować zachowanie (przylega do BDD). Klasa testu wyglądałby następująco:

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

"Cierpliwość" to [moje imię] (http://www.ask.com/question/what-is-the-meing-of-the-name-dhiraj), nie żartuję;). Szczerze mówiąc, ostatnio miałem [prezentacja] (http://dmahapatro.github.io/bdd-grails-spock-presentation/#/) na spocku w lokalnej grupie Grails User, więc pomyślałem, że będę się chwalić czymś, co pracowałem na. ;) @ SérgioMichels – dmahapatro

+0

@dmahapatro Kiedy 'User' nie jest jednostką opartą na' grails-app/domain', otrzymuję 'Failure: test Użytkownicy są poprawnie obsługiwani (np.zazzercode.service.EncouragementServiceSpec) | org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Nie można dodać klasy Domain [class np.zazzercode.domain.User]. To nie jest domena! \t na grails.test.mixin.domain.DomainClassUnitTestMixin.registerGrailsDomainClass (DomainClassUnitTestMixin.groovy: 209) ' – prayagupd

+0

@PrayagUpd Tak, jeśli użytkownik nie jest klasa domeny, wtedy nie trzeba' @ Mock' to, co mam na myśli w odpowiedzi. – dmahapatro

4

Użyj build-test-data plugin zbudować użytkowników.

@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()] 
    } 
} 

Wprowadziłem również kilka zmian w kodzie, aby dostosować go do specyfikacji spocku. Twój test musi rozszerzyć specyfikację i możesz chcieć zapoznać się z Spock's keywords.

+0

[plugin budować testowej danych] (https://github.com/tednaleid/build-test-data) wygląda super, ale nie wydają się działać dla non 'podmioty oparte na grails-app/domain'. Zgłasza wyjątek 'org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Nie można dodać klasy Domain [class np.zazzercode.domain.User]. To nie jest Domena " – prayagupd

+0

Tak, działa tylko dla klas domeny. – Nicholas

Powiązane problemy