2011-09-12 29 views
0

我們的應用程序當前共享Java和Javascript端之間的消息。它們在類路徑中存儲爲資源包,並且我們有一個自定義控制器,將所有消息作爲Json返回。客戶端代碼如下所示:JAWR i18n:使用消息時的單元測試javascript

// This calls the controller to get all the messages 
var messages = MessageBundle(); 
var text = messages.get('my.message', 1); 

這很棒,因爲我們可以在單元測試中模擬「消息」。


我想開始使用JAWR這一點,因爲我們已經將它用於其他事情。問題是JAWR generates the following Javascript object

var text = messages.my.message(1); 

這意味着不能進行單元測試了除非單元測試也與右嵌套對象定義一個全局「消息」變量的代碼。有沒有解決的辦法?任何想法如何擴展JAWR來使這個單元可測試?

目前我的解決辦法是:

function messages() { 
    var args = Array.prototype.slice.call(arguments); 
    var messageId = args.shift(); 
    var messageFunc = window.messages;   
    messageId.split('.').forEach(function(part) { 
     messageFunc = messageFunc[part]; 
    }); 
    return messageFunc(args); 
} 

// Same syntax as the old one, but uses the JAWR object behind the scenes 
// This function is easy to mock for a unit test 
var text = messages('my.message', 1); 

感謝您的想法!

回答

0

也許下一個樣品可以幫助你。

1)

function messagesTester(funcPath,id) { 
    var args=funcPath.split('.'),root=window.messages; 
    for(var i=0;i<args.length;i++)root=root[args[i]]; 
    return root(id); 
    // or if more that one parameter for *func*, then, for example: 
    // return root.apply(null,Array.prototype.slice(arguments,1)); 
} 
var text = messagesTester('my.message',1); 

2)

function messagesTester(funcPath) { 
    var args=funcPath.split('.'),root=window.messages; 
    for(var i=0;i<args.length;i++)root=root[args[i]]; 
    return root; 
} 
// var text = messagesTester('my.message')(/*arguments list*/); 
var text = messagesTester('my.message')(1); 
+0

感謝。如果我理解的很好,這些解決方案的這些不同的實施?我喜歡#2如何分離參數,而不是將第一個用作ID,其餘用作參數。 我真的很希望能夠改變JAWR生成消息的方式。每次我想要讀取一個字符串時,處理「消息」對象似乎是一個很大的開銷。也許JAWR可以生成消息函數的hashmap? – Gromix

+0

我對JAWR並不熟悉,無法幫助您使用_「改變JAWR生成消息的方式」_。我只是爲你展示了一些_「你當前的工作環境」_的變體。 –

+0

謝謝,我想我必須做這個,除非有一種方法來配置JAWR的方式不同。我可能會使用你的選項2),看起來比我的簡潔,歡呼。 – Gromix