2013-07-24 41 views
8

Tôi có câu hỏi chung hơn. Tôi nên sử dụng khung hoặc triển khai nào để mô phỏng trong Grails 2.x khi sử dụng Spock?Thử nghiệm Grails với Spock - Khung Mocking nào Chọn?

Tôi biết tấn phong cách nhạo báng: đòn bẩy Groovy metaClass, Grails mockFor(), Groovy Mock(), kiểu đóng gói Groovy, vv Mỗi loại đều có những ưu điểm và nhược điểm riêng. Nhưng những gì tôi không hiểu là một số phong cách chế giễu làm việc trong những dịp nhất định mà tôi không thể xác định (tức là mockFor() hoạt động để thực hiện nhất định và không cho những người khác).

Hiện tại tôi có hai cách thực hiện tương tự phương thức dịch vụ nhạo báng.

Cái này hoạt động:

@TestFor(MyController) 
@Mock([MyDevice]) 
class MyControllerSpec extends ControllerSpec { 

void "test st."() { 
     def myService = mockFor(MyService) 
     myService.demand.myMethod() { def st -> 
     return "test" 
     } 
     controller.myService = myService.createMock() 
} 
} 

Tuy nhiên, thực hiện điều này không làm việc:

@TestFor(MyController) 
@Mock([MyDevice]) 
class MyControllerSpec extends ControllerSpec { 

void "test st."() { 
     def yourService = mockFor(YourService) 
     yourService.demand.yourMethod() { def st -> 
     return "test" 
     } 
     controller.yourService = yourService.createMock() 
} 
} 

Việc thực hiện dịch vụ và gọi từ bộ điều khiển là khá tương tự. Vì vậy, thực hành tốt nhất của chế giễu trong Grails là gì? Hoặc là có bất kỳ khuôn khổ mocking GOOD cho Grails mà sẽ tiết kiệm thời gian của tôi tìm ra cách để chế giễu?

Cảm ơn lời khuyên nào! :-)

Mateo

+1

Bạn đã thử khung giả lập của Spock chưa? Nó thực sự rõ ràng và đơn giản. Các tài liệu spock nói rằng nó có thể làm việc với mock spock hoặc mock Groovy, nhưng cảnh báo không nên thử kết hợp hai khung mock vì một lý do nào đó. –

+0

Vâng, đây thực sự là những gì sẽ được sử dụng khi bạn gọi mockFor(); grails.plugin.spock.UnitSpec.mockFor() được gọi. Những gì tôi thấy hữu ích nhất là sử dụng lập trình metaClass trực tiếp để chế nhạo cũng như đóng cửa groovy. Vấn đề duy nhất với điều này là metaClass có thể can thiệp vào các thử nghiệm khác khi bạn không làm sạch nó trong phần nguy hiểm. Có lẽ Grails 2.3 sẽ mang lại sự hỗ trợ tốt hơn vì Spock sẽ mặc định cho phiên bản này ... – kuceram

+0

Nếu câu trả lời phù hợp và đáp ứng kỳ vọng của bạn thì hãy chấp nhận nó để giúp người khác học hỏi từ câu hỏi của bạn. – dmahapatro

Trả lời

7

Khi bạn đang sử dụng khuôn khổ Spock để thử nghiệm, sau đó cố gắng tận dụng các tùy chọn và phong cách được cung cấp bởi khuôn khổ riêng của mình.

Khuôn khổ Spock giúp đạt được BDD [Phát triển thiết kế hành vi]. Theo hành vi của tôi, bạn có thể kết hợp chặt chẽ kịch bản chấp nhận kinh doanh với chu kỳ phát triển.

tôi đã cố gắng để có được trường hợp thử nghiệm của bạn viết bằng Spock vì nó có thể được viết lại như sau:

@TestFor(MyController) 
class MyControllerSpec extends ControllerSpec { 

    void "test service method in called once and only once"(){ 
     //Defines the behavior of setup 
     setup: "Only one invocation of service method" 
      def myService = Mock(MyService){ 
       //Make sure serviceMethod is called only once from the controller 
       //Beauty of Spock is that you can test the cardinality of 
       //method invocations. 
       1 * serviceMethod() >> "Hello" 
      } 
      controller.myService = myService 

      //The above process can be followed 
      //for stubbing/mocking 'YourService' and 
      //then injecting it to controller like 
      //controller.yourService = yourService 

     //Defines the behavior of action 
     when: "controller action is called" 
      controller.myAction() 

     //Defines the behavior of expected results 
     then: "Expect the stubbed service method output" 
      controller.response.contentAsString == "Hello" 
    } 
} 

//Controller 
def myAction() { 
    render myService.serviceMethod() 
} 

Nếu bạn thấy ở trên, bạn xác định các hành vi trong mỗi bước. Từ quan điểm của doanh nghiệp, hành vi đó sẽ do BA hoặc các bên liên quan điều khiển. Bằng cách này, bạn tuân thủ ATDD/BDD (Kiểm tra chấp nhận điều khiển Dev/Hành vi thử nghiệm Driven Dev) và cuối cùng là một TDD (Test Driven Dev) cho dự án của bạn.

Để biết thêm chi tiết về cách sử dụng khuôn khổ spock một cách hiệu quả, hãy truy cập vào khuôn khổ spock docs.

Các vấn đề liên quan