首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这些罪恶的存根决定不明确?

为什么这些罪恶的存根决定不明确?
EN

Stack Overflow用户
提问于 2020-08-07 11:19:46
回答 1查看 1.5K关注 0票数 0

我为下面的代码编写了一个单元测试,并使用Sinon (更具体地说:锡铬,一个过时但仍在运行的用例库)对浏览器方法(阅读: written )进行了编辑。

代码语言:javascript
复制
/**
 * Returns an array of languages based on getAcceptLanguages and getUILanguage to use as defaults
 * for when no saved languages exist in browser storage.
 *
 * @memberof Helpers
 * @returns {array} Array of language codes i.e. ['en-US', 'fr']
 */
async function getDefaultLanguages () {
  const acceptedLanguages = await browser.i18n.getAcceptLanguages()
  const uiLanguage = browser.i18n.getUILanguage()

  return [uiLanguage].concat(acceptedLanguages)
}

单元测试:

代码语言:javascript
复制
const sinon = require('sinon')
const browser = require('sinon-chrome/extensions')
const { assert } = require('chai')
const helpers = require('../src/helpers')

// helpers that rely on the web-extension API (will need to be mocked)
describe('Helpers: Web-Extension API', function () {
  const { getDefaultLanguages } = helpers

  let languages

  before(async function () {
    global.browser = browser // need to patch global browser with mocked api
    browser.menus = browser.contextMenus // sinon-chrome doesn't wrap this method as it should
    
    sinon.stub(browser.i18n, 'getAcceptLanguages').resolves(['de-de', 'en-au'])
    sinon.stub(browser.i18n, 'getUILanguage').returns('en-en')

    languages = await getDefaultLanguages()
  })

  it('asserts that getDefaultLanguages() returns an array of strings', function () {
    assert.isTrue(languages.every(x => typeof x === 'string'))
  })

  it('asserts that getDefaultLanguages() includes UI and i18n languages', function () {
    assert.sameMembers(languages, ['de-de', 'en-en', 'en-au'])
  })
})

测试失败是因为两个返回未定义的存根方法,但是Sinon docs状态非常清楚地表明stub.resolves(value)

使存根返回解析为所提供的值的承诺。 在构建承诺时,sinon使用了Promise.resolve方法。您有责任在不提供承诺的环境中提供多填充。可以使用usingPromise方法覆盖允诺库。

由于节点已经构建了承诺支持,所以我希望上面的存根使用指定的值(区域字符串数组和区域设置字符串)进行解析,但都是未定义的解析/返回。

如果能帮上忙就好了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 15:26:46

无论出于什么原因,sinon都需要在运行时和运行测试之前注册“i18n”插件。

为什么web扩展API的这个特定部分不是以相同的方式实现,所有其他的模拟仍然是一个谜,但添加两行修复了问题,并允许sinon存根按预期的方式工作:

代码语言:javascript
复制
const sinon = require('sinon')
const browser = require('sinon-chrome/extensions')
const I18nPlugin = require('sinon-chrome/plugins').I18nPlugin // I18n plugin constructor
const { assert } = require('chai')
const helpers = require('../src/helpers')

// helpers that rely on the web-extension API (will need to be mocked)
describe('Helpers: Web-Extension API', function () {
  const { getDefaultLanguages } = helpers

  let languages

  before(async function () {
    global.browser = browser // need to patch global browser with mocked api
    browser.menus = browser.contextMenus // sinon-chrome doesn't wrap this method as it should
    browser.registerPlugin(new I18nPlugin()) // register the plugin on browser instance
    
    sinon.stub(browser.i18n, 'getAcceptLanguages').resolves(['de-de', 'en-au'])
    sinon.stub(browser.i18n, 'getUILanguage').returns('en-en')

    languages = await getDefaultLanguages()
  })
})

如果您试图监视不存在的对象属性,或者给定属性不是函数,则Sinon-chrome将引发类型错误。不幸的是,如果试图存根一个不存在的对象属性(这似乎是一个糟糕的设计选择),它不会抛出任何错误,而只是返回未定义的。

这就是为什么原始代码中的returns()resolves()存根都返回未定义的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63300752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档