2013-09-05 57 views
10

Tôi có một EncouragementService.groovy với phương pháp sau đâyLàm thế nào để kiểm tra dịch vụ Grails sử dụng Spock?

class EncouragementService { 
    def stripePaymentService 

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

Để kiểm tra trên mã trong vũ trụ JAVA, sử dụng JUnit đầu tiên tôi sẽ tạo ra hai hoặc ba người dùng trong thiết lập. Chuyển danh sách người dùng đến phương thức encourageUsers(...) và kiểm tra bất kỳ điều gì tôi muốn với kết quả.

Làm thế nào tôi có thể đạt được điều tương tự ở đây trong 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] 
    } 
} 

Tôi đang sử dụng spock:0.7

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

Trả lời

13

lớp dịch vụ có thể được tối ưu hóa như sau:

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

Spock Unit Test:
Spock có thử nghiệm cho toàn bộ một tầm cao mới, nơi bạn có thể kiểm tra hành vi (tuân thủ BDD). Lớp kiểm tra sẽ trông giống như:

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

"Kiên nhẫn" là [tên của tôi] (http://www.ask.com/question/what-is-the-meaning-of-the-name-dhiraj), tôi không nói đùa;). Thành thật mà nói, gần đây tôi đã có một [bài thuyết trình] (http://dmahapatro.github.io/bdd-grails-spock-presentation/#/) về spock trong nhóm người dùng Grails User, vì vậy tôi nghĩ rằng tôi sẽ khoe khoang về điều gì đó tôi đã làm việc trên. ;) @ SérgioMichels – dmahapatro

+0

@dmahapatro Khi 'Người dùng' không phải là thực thể dựa trên' grails-app/domain', tôi nhận được 'Thất bại: người dùng thử nghiệm được xử lý đúng cách (np.zazzercode.service.EncouragementServiceSpec) | org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Không thể thêm lớp Domain [class np.zazzercode.domain.User]. Nó không phải là một tên miền! \t tại grails.test.mixin.domain.DomainClassUnitTestMixin.registerGrailsDomainClass (DomainClassUnitTestMixin.groovy: 209) ' – prayagupd

+0

@PrayagUpd Yea, nếu tài khoản không phải là một lớp miền, sau đó bạn sẽ không cần '@ Mock' đó là những gì tôi muốn nói trong câu trả lời. – dmahapatro

4

Sử dụng build-test-data plugin để xây dựng người sử dụng.

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

Tôi cũng đã thực hiện một số thay đổi đối với mã để biến nó trở thành thông số kỹ thuật thích hợp cho spock. Bài kiểm tra của bạn phải mở rộng Đặc điểm kỹ thuật và bạn có thể muốn tự làm quen với Spock's keywords.

+0

[plugin xây dựng-kiểm tra dữ liệu] (https://github.com/tednaleid/build-test-data) trông thật tuyệt, nhưng dường như không hoạt động Các thực thể dựa trên 'grails-app/domain'. Ném ngoại lệ 'org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Không thể thêm lớp Miền [class np.zazzercode.domain.User]. Nó không phải là một miền ' – prayagupd

+0

Có, nó chỉ làm việc cho các lớp miền. – Nicholas