5

sandbox.stubテスト フレームワークSinonnavigator.languageを使用して、たとえば、またはテストのために上書きするにはどうすればよいnavigator.userAgentですか?

以下を使用しようとすると:

suite('agent', function () {
  var sandbox;
  setup(function () {
    // create sandbox environment for mocking about
    sandbox = sinon.sandbox.create();
  });
  teardown(function () {
    // restore the environment as it was before
    sandbox.restore();
  });
  test('language', function () {
    assert.equal(au.env.agent.language, navigator.language);
    if (!navigator.language) assert.equal(au.env.agent.language, 'de');
    var lang = "test_URK";
    sandbox.stub(window.navigator, 'language', lang);
    assert.equal(au.env.agent.language, lang);
  });
});

次に、次のエラーが表示されます:存在しない独自のプロパティ言語をスタブできません:

これらのスタブはどれも期待どおりに機能しません。

  • sandbox.stub(window.navigator, 'language', lang);
  • sandbox.stub(navigator, 'browserLanguage', lang);

ナビゲーターオブジェクトを嘲笑しています。

ヒントはありますか?

4

3 に答える 3

3

javascript でユーザーエージェントをモックするで説明されているように? 、 あなたはできる:

  navigator.__defineGetter__('language', function(){
      return 'foo';
  });

または、より現代的なもの:

  Object.defineProperty(navigator, 'language', {
      get: function() {return 'bar';}
  });

于 2016-07-14T19:22:30.137 に答える
1

ここにシノンはいらない。問題は、少なくとも Chrome + Safari では、navigator.language (およびその他) が読み取り専用であるため、変更できないことです。ただし、ナビゲーター オブジェクト全体を再作成することはできます。

navigator = {
    userLanguage: 'de',
    language: 'en'
};

私のテストでは、関数を呼び出す前に目的の言語を定義するだけでした。

// eg: following fn returns navigator.userLanguage || navigator.language;
navigator.userLanguage = undefined; // non IE
LanguageRedirection.getBrowserLanguage().then(function(lang){
   expect(res).toEqual('en');
});
于 2016-07-20T09:25:36.733 に答える