2014-11-11 30 views
5

Hi Tôi có một bộ điều khiển gọi là ApiController trong đó sử dụng một dịch vụ gọi ApiService như vậy:Grails Spock thử nghiệm điều khiển và dịch vụ

def createCategory(){ 
     def jsonObj = request.JSON 
     jsonObj.each{ key, value -> 
      params.put(key,value) 
     } 
     render apiService.createCategory(params) 
} 

nào hoạt động tốt. Nhưng tôi dường như không thể viết một bài kiểm tra cho nó.

Đây là cách nay tôi đã có:

@TestFor(ApiController) 
@Mock([Category,ApiService]) 
class CategorySpec extends Specification { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test"() { 

     setup: 
     def apiService = Mock(ApiService) 

     when: 
     request.method = 'POST' 
     request.requestMethod = 'POST' 
     params.categoryID = 'test' 

     controller.createCategory() 

     then: 
     println(response) 
     1==1 

    } 

Từ đó tôi nhận được lỗi sau:

java.lang.NullPointerException: Cannot invoke method createCategory() on null object 

Điều này rõ ràng là vì Nó không thể nhìn thấy đậu apiService tôi. Vì vậy, câu hỏi của tôi là làm thế nào để tôi làm điều này trong Spock?

+0

bộ điều khiển của bạn có thể kết hợp createCategory() như thế nào ... hoặc cung cấp cấu trúc chi tiết của controoler đó. –

Trả lời

7

Đó là nhiều khả năng để làm với Transactional bug: https://github.com/grails/grails-core/issues/1501

ApiService apiService = new ApiService() 
controller.apiService = apiService 
apiService.transactionManager = Mock(PlatformTransactionManager) { getTransaction(_) >> Mock(TransactionStatus) } 

Đây là một sửa chữa tạm thời (theo nhận xét báo cáo lỗi) ... điều này đã làm việc cho tôi :)

+0

Ghét lỗi này ... nhưng tôi biết họ đã có rất nhiều trên đĩa của họ! – th3morg

+0

Cảm ơn, tôi nghĩ tôi sẽ không bao giờ biết tại sao nó không hoạt động. – Roland

1

Đây là cách tôi sẽ làm điều đó trong Grails 2.4, mà không chú thích @Mock trên lớp spec:

when: 
    def serviceMock = mockFor(ApiService) 
    serviceMock.demand.createCategory { def params -> "output sample" } 
    controller.apiService = serviceMock.createMock() 
    controller.createCategory() 
0

ApiService đang chế giễu thành công trong các thử nghiệm nhưng làm thế nào bạn cung cấp các mô hình với bộ điều khiển? Thông số kỹ thuật của đơn vị bị tước đi DI, bạn không thể mong đợi nó được tự động. Do đó,

setup: 
controller.apiService = Mock(ApiService) 
Các vấn đề liên quan