2012-02-03 14 views
12

Tôi sử dụng gói tin trong một trong các dịch vụ của tôi trong dự án Grails 2.0 cho văn bản quốc tế. Trường hợp sử dụng là một chủ đề email được gửi qua plugin thư theo cách không đồng bộ, do đó thực sự không có điều này trong bộ điều khiển hoặc TagLib (do đối số thông thường không truy cập vào văn bản hoặc chế độ xem của bạn trong dịch vụ). Mã này hoạt động tốt trong ứng dụng Grails đang chạy của tôi, nhưng tôi không chắc chắn làm thế nào để kiểm tra nó.Cách sử dụng thử nghiệm đơn vị hoặc tích hợp của nguồn tin nhắn được tiêm cho i18n trong dịch vụ Grails 2.0

Tôi đã thử một PluginAwareResourceBundleMessageSource trong defineBeans của tôi vì đó là ứng dụng đang chạy của tôi, nhưng nó dẫn đến nullpointers vì nó xuất hiện cần một bó thiết lập xung quanh trình quản lý plugin và môi trường thử nghiệm của tôi không đưa ra (thậm chí tích hợp) .

Sau đó, tôi đã thử một ReloadableResourceBundleMessageSource vì nó là Spring thuần túy, nhưng có vẻ như không thấy tệp .properties của tôi và không có thông báo Không tìm thấy mã dưới 'my.email.subject' cho ngôn ngữ 'en'.

Tôi cảm thấy như tôi đang đi xuống một wormhole một chút như truy cập Grails i18n trong một dịch vụ không được tài liệu trong tài liệu grails, vì vậy nếu có một cách ưa thích để làm điều này, cho tôi biết.

Lưu ý tệp .properties của tôi ở vị trí tiêu chuẩn grails-app/i18n.

Bài kiểm tra

@TestFor(EmailHelperService) 
class EmailHelperServiceTests { 

    void testSubjectsDefaultLocale() { 
     defineBeans { 
      //messageSource(PluginAwareResourceBundleMessageSource); Leads to nullpointers 
      messageSource(ReloadableResourceBundleMessageSource); 

     } 
     String expected = "My Expected subject Passed1 Passed2"; 
     String actual = service.getEmailSubjectForStandardMustGiveGiftFromBusiness(Locale.ENGLISH, Passed1 Passed2); 
     assertEquals("email subject", expected, actual); 

} 

dịch vụ:

class EmailHelperService { 
    def messageSource; 

    public String getEmailSubject(Locale locale, String param1, String param2) { 
     Object[] params = [param1, param2].toArray();  
     return messageSource.getMessage("my.email.subject", params, locale);  
    } 
+0

là ý định của bạn để đảm bảo rằng bạn đang có dây lên một cách chính xác với một bài kiểm tra này? Hay bạn đang định viết một cái cho mỗi ngôn ngữ bạn hỗ trợ? Ngoài ra, bài kiểm tra ở trên của bạn là bài kiểm tra Đơn vị hoặc bài kiểm tra Tích hợp? –

+0

ý tưởng là ít hơn để kiểm tra dây lò xo nhưng nhiều hơn để kiểm tra các ngôn ngữ khác nhau khi chúng được hỗ trợ, và để kiểm tra tính chính xác của khóa trong .properties và văn bản. Tôi đơn giản hóa các params cho mục đích dễ đọc nhưng kiểm tra tính chính xác của họ mong muốn. – Peter

Trả lời

27

Đã có một messageSource trong các thử nghiệm đơn vị trong Grails, nó là một StaticMessageSource (xem http://static.springsource.org/spring/docs/2.5.4/api/org/springframework/context/support/StaticMessageSource.html), bạn có thể thêm các thông điệp giả với phương pháp addMessage:

messageSource.addMessage("foo.bar", request.locale, "My Message") 
+0

Cảm ơn, điều cần biết - có thể xác nhận hợp lệ với các thông số bằng cách sử dụng StaticMessageSource và Message có {0} trình giữ chỗ kiểu? – Peter

+0

Để trả lời nhận xét của riêng tôi, hãy thử nghiệm với trình giữ chỗ và hoạt động tuyệt vời. Cảm ơn. – Peter

+3

Tôi biết câu hỏi này là cũ nhưng tôi thấy nó hữu ích để giúp tôi đi đúng hướng. Đây là giải pháp của tôi để chế nhạo nguồn tin nhắn để thử nghiệm. Đầu tiên, tôi nhận được thông báoSource: 'MessageSource messageSource = getMessageSource()' Đúng là messageSource nằm trong các bài kiểm thử đơn vị nhưng nó trống. Vì vậy, tôi đã làm như @Graem Rocher đề xuất và điền vào MessageSource với các thông điệp liên quan cho bài kiểm tra này. 'messageSource.addMessage (" messageService.sms.aNumber.recovery.message ", Locale.default," {0}, số A của bạn là {1} ")' – CheddarMonkey

2

Trong một thử nghiệm đơn vị bạn có thể đảm bảo rằng bạn có dây lên một cách chính xác bằng cách làm một cái gì đó như thế này:

void testSubjectsDefaultLocale() { 
    def messageSource = new Object() 
    messageSource.metaClass.getMessage = {subject, params, locale -> 
     assert "my.email.subject" == subject 
     assert ["Passed1", "Passed2"] == params 
     assert Locale.ENGLISH == locale 
     "It Worked!!!" 
    } 
    service.messageSource = messageSource 
    String actual = service.getEmailSubjectForStandardMustGiveGiftFromBusiness(Locale.ENGLISH, Passed1 Passed2) 
    assert "It Worked!!!" == actual 
} 

này sẽ giúp đảm bảo rằng bạn được kết nối đúng cách nhưng nó sẽ không đảm bảo rằng những gì bạn đang thực sự hoạt động. Nếu bạn cảm thấy thoải mái với điều đó thì điều này sẽ phù hợp với bạn. Nếu bạn đang cố gắng kiểm tra khi bạn đưa "XYZ" vào tệp .properties của bạn, nó trả về "Xin chào" thì điều này sẽ không hiệu quả với bạn.

+0

Cảm ơn ý tưởng. Tôi ít quan tâm đến hệ thống dây lò xo, nhưng tôi muốn tải các tập tin thực sự của tôi (hoặc trực tiếp hoặc thông qua Spring) thay vì tuyên bố nó trong bài kiểm tra, vì kiểm tra nội dung và độ chính xác chính là thứ tôi muốn. – Peter

4

Trong các thử nghiệm đơn vị và phía địa phương của chức năng kiểm tra, đôi khi bạn muốn các thuộc tính thực có trong thư mục 18n.

này làm việc cho tôi:

MessageSource getI18n() { 
    // assuming the test cwd is the project dir (where application.properties is) 
    URL url = new File('grails-app/i18n').toURI().toURL() 
    def messageSource = new ResourceBundleMessageSource() 
    messageSource.bundleClassLoader = new URLClassLoader(url) 
    messageSource.basename = 'messages' 
    messageSource 
    } 

    i18n.getMessage(key, params, locale) 
Các vấn đề liên quan