2013-02-28 24 views
5

Sử dụng Grails 2.1.0Kiểm tra xác nhận bộ điều khiển Grails đưa ra các xác nhận về mô hình khi hiển thị mẫu?

Dường như làm điều này từ một bộ điều khiển:

render(view: "someView", model: [modelEntry: "hello"]) 

cho phép tôi làm điều này trong một thử nghiệm đơn vị cho bộ điều khiển rằng:

controller.method() 
assert model.modelEntry == "hello" 

Tuy nhiên, nếu Tôi thay đổi bộ điều khiển để thực hiện việc này:

render(template: "someTemplate", model: [modelEntry: "hello"]) 

Bây giờ, mô hình Ví dụ trong thử nghiệm là một mảng trống. Tôi đã thực hiện khá nhiều tìm kiếm về điều này, và hầu hết các giải pháp dường như dành cho Grails 1, thường liên quan đến đối tượng modelAndView (không tồn tại trong bài kiểm tra của tôi) hoặc renderArgs (ditto).

Giải pháp duy nhất tôi đã tìm thấy là để tự ghi đè lên các quan điểm trong kiểm tra, như thế này:

views['_someTemplate.gsp'] = '${modelEntry}' 

và sau đó làm khẳng định về chuỗi. Nhưng tôi không thích giải pháp này vì nó:

  1. đòi hỏi sự kiểm tra biết tên tập tin của mẫu
  2. gây khó khăn cho mục mô hình thử nghiệm mà không có toString tốt() phương pháp
  3. gây khó khăn cho thực hiện nhiều xác nhận về các mục nhập mô hình liên quan.

Có cách nào để trực tiếp nhận được các mục nhập trong mô hình từ trường hợp kiểm tra khi trình điều khiển hiển thị mẫu không?

+0

'controller.modelAndView.model' không tồn tại? –

+0

@ SérgioMichels chính xác, 'controller.modelAndView' là null. Hãy ghi nhớ, điều này là sử dụng phong cách Grails 2 thành ngữ, trong đó một bài kiểm tra được khai báo là một '@TestFor (WhateverController)' và bài kiểm tra không mở rộng bất cứ điều gì. Tôi không chắc liệu điều modelAndView có hoạt động cho grails 1 hay không và tại sao tôi luôn thấy gợi ý đó, nhưng nó không nằm trong kiểu thử nghiệm này cho Grails 2. – Rod

Trả lời

9

Đào một chút trong mã của phương thức hiển thị (org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod) Tôi có thể thấy rằng modelAndView chỉ được đặt khi bạn hiển thị view.

Hiển thị mẫu sẽ trả về mô hình nullAndView thực sự.

Để kiểm tra mô hình trong trường hợp này, tôi nghĩ bạn có thể sử dụng Groovy metaClass. Ý tưởng là để ngăn chặn các phương pháp ban đầu, lưu trữ các giá trị và sau đó gọi anh ta.

Dựa trên this question, tôi builded này (không được thử nghiệm, có thể cần Điều chỉnh):

@TestFor(MyController) 
class MyControllerTests 

    def templateModel 

    @Test 
    void inspectTemplateModel() { 
    def originalMethod = MyController.metaClass.getMetaMethod('render', [Map] as Class[]) 
    controller.metaClass.render = { Map args -> 
     templateModel = args.model 
     originalMethod.invoke(delegate, args) 
    } 

    controller.method() 
    assert templateModel.modelEntry == 'foo' 

} 
+0

Yep, đã hoạt động. Thật ngạc nhiên khi nó đòi hỏi loại thủ đoạn này. Tôi đã thực hiện giải pháp của bạn thêm một bước nữa, thay vì templateModel Tôi thực sự gán một modelAndView trên cá thể bộ điều khiển, làm cho phần còn lại của mã hoạt động như bạn mong đợi nếu nó là một khung nhìn – Rod

+0

Vâng, bạn có thể nâng cấp [JIRA] (http://jira.grails.org/browse/GRAILS), yêu cầu một cách tốt hơn để truy cập vào mô hình mẫu cho các bài kiểm tra của bạn. Đây là vẻ đẹp của sự cải thiện :) –

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