5

如何使用sandbox.stub测试框架Sinon覆盖例如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, '语言', lang);
  • sandbox.stub(navigator, 'browserLanguage', lang);

正在嘲笑导航器对象

有什么提示吗?

4

3 回答 3

3

Mocking a useragent in 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 对象,因为你无论如何都要模拟它。

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 回答
-2

这对我有用:

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"
});
于 2019-09-27T18:12:24.857 回答