我为下面的代码编写了一个单元测试,并使用Sinon (更具体地说:锡铬,一个过时但仍在运行的用例库)对浏览器方法(阅读: written )进行了编辑。
/**
* 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)
}单元测试:
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方法覆盖允诺库。
由于节点已经构建了承诺支持,所以我希望上面的存根使用指定的值(区域字符串数组和区域设置字符串)进行解析,但都是未定义的解析/返回。
如果能帮上忙就好了!
发布于 2020-08-10 15:26:46
无论出于什么原因,sinon都需要在运行时和运行测试之前注册“i18n”插件。
为什么web扩展API的这个特定部分不是以相同的方式实现,所有其他的模拟仍然是一个谜,但添加两行修复了问题,并允许sinon存根按预期的方式工作:
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()存根都返回未定义的原因。
https://stackoverflow.com/questions/63300752
复制相似问题