【问题标题】:Testing navigator.browserLanguage or navigator.language with Sinon.js使用 Sinon.js 测试 navigator.browserLanguage 或 navigator.language
【发布时间】:2016-02-09 15:07:11
【问题描述】:

如何使用测试框架Sinonsandbox.stub 覆盖例如navigator.languagenavigator.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);
  });
});

然后我会得到以下错误:Cannot stub non-existent own property language

这些存根都不能按预期工作:

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

正在模拟 导航器对象

有什么提示吗?

【问题讨论】:

    标签: javascript unit-testing mocha.js sinon web-component-tester


    【解决方案1】:

    Mocking a useragent in javascript? 中所述,您可以:

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

    或者更现代的:

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

    【讨论】:

    • 这对我不起作用,使用 jasmine + karma 获取 TypeError: Attempting to change access mechanism for an unconfigurable property.
    • 我的错。在我的示例代码中,我两者都有,defineProperty 在 defineGetter 之后工作,但是当我注释掉 defineGetter 时,我得到了和你一样的错误。
    • defineProperty 在您使用如下属性描述符时起作用:Object.defineProperty(window.navigator, 'language', {value: 'en-US', configurable: true});
    【解决方案2】:

    这里不需要诗乃。问题是,至少 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');
    });
    

    【讨论】:

      【解决方案3】:

      这对我有用:

      sinon.stub(global, "navigator").returns({
        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
      });
      

      【讨论】:

        猜你喜欢
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        • 2016-07-04
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        相关资源
        最近更新 更多