我有一个功能,可以在cookie中设置语言并获取某些功能。如何正确设置语言的值以便在JEST中进行测试
function resolveLanguage () {
// browser cookie is checked to see if there is a value for language
const lang = Cookie.get('language')
// If no lang, it is defaulted to en
return lang || 'en'
}
现在我想在JEST中测试它
it('can resolve the language using a cookie', () => {
Cookie.__defineGetter__("language", function() {
return 'fr'
})
// console.log(Cookie.language) //returns fr
// console.log(Cookie.get('language')) //returns fr
expect(module.resolveLanguage()).toBe('fr') ---FAILS because it returns en
})
答案 0 :(得分:4)
不必下载任何Dep,只需使用:
Object.defineProperty(window.document, 'cookie', {
writable: true,
value: 'myCookie=omnomnom',
});
({writable
必须设置为true)
答案 1 :(得分:4)
在JEST中使用setFilesAfterEnv选项时,将以下内容添加到已定义的安装文件中效果很好。
启用正常的cookie处理,而不会进行任何模拟。
let __cookies;
Object.defineProperty( window.document, 'cookie', {
get: () => __cookies,
set: v => __cookies = v,
split: s => __cookies.split( s ),
} );
答案 2 :(得分:1)
您需要使用jest模拟js-cookie
来设置所需的语言集。
import Cookie from 'js-cookie'
jest.mock('js-cookie', ()=> jest.fn())
Cookie.setMockImplementation(()=>({get: () => 'fr'}))
或者,如果您只需要设置一次
jest.mock('js-cookie', ()=>({get: () => 'fr'}))
请注意,此解决方案始终会返回' fr'适用于所有Cookie.get
次来电。如果您需要支持多个值,您可以执行以下操作:
jest.mock('js-cookie', ()=>({get: key => {
language: 'fr',
somethingElse: 'someThing'
}[key]}))
答案 3 :(得分:1)
以下代码有助于为Jest中的所有类型的测试模拟cookie的设置/获取:
Object.defineProperty(document, "doctype", {
value: "<!DOCTYPE html>"
});
let setCookie = (v) => v;
Object.defineProperty(window.navigator, 'cookieEnabled', (function (_value) {
return {
get: function _get() {
return _value;
},
set: function _set(v) {
_value = v;
},
configurable: true
};
})(window.navigator.cookieEnabled));
setCookie = (v) => v;
Object.defineProperty(window.document, 'cookie', (function (_value) {
return {
get: function _get() {
return _value;
},
set: function _set(v) {
_value = setCookie(v);
},
configurable: true
};
})(window.navigator.cookieEnabled));
答案 4 :(得分:0)
我尝试了这个,并且奏效了:
import Cookies from 'js-cookie';
Cookies.get = jest.fn()
.mockImplementation(() => 'fr');
如果您想在每次调用Cookies.get()
时返回不同的值,则可以执行以下操作:
Cookies.get = jest.fn()
.mockImplementationOnce(() => 'en') // first time
.mockImplementationOnce(() => 'de'); // second time