0

私たちのアプリケーションは現在、Java 側と Javascript 側の間でメッセージを共有しています。これらはリソース バンドルとしてクラス パスに格納され、すべてのメッセージを Json として返すカスタム コントローラーがあります。クライアント側のコードは次のようになります。

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

単体テストで「メッセージ」をモックできるので、これは素晴らしいことです。


JAWR はすでに他の用途で使用しているため、この目的でJAWRを使用したいと考えています。問題は、JAWRが次の Javascript オブジェクトを生成することです。

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);

アイデアをありがとう!

4

1 に答える 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);
于 2011-09-12T06:11:03.017 に答える