我有一个功能,可以在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'
}
Run Code Online (Sandbox Code Playgroud)
现在我想在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
})
Run Code Online (Sandbox Code Playgroud)
您需要js-cookie使用 jest进行模拟以设置所需的语言集。
import Cookie from 'js-cookie'
jest.mock('js-cookie', ()=> jest.fn())
Cookie.setMockImplementation(()=>({get: () => 'fr'}))
Run Code Online (Sandbox Code Playgroud)
或者如果你只需要设置一次
jest.mock('js-cookie', ()=>({get: () => 'fr'}))
Run Code Online (Sandbox Code Playgroud)
请注意,此解决方案将始终为所有Cookie.get调用返回 'fr' 。如果您需要在 get 上支持多个值,您可以执行以下操作:
jest.mock('js-cookie', ()=>({get: key => {
language: 'fr',
somethingElse: 'someThing'
}[key]}))
Run Code Online (Sandbox Code Playgroud)
无需下载任何部门,只需使用:
Object.defineProperty(window.document, 'cookie', {
writable: true,
value: 'myCookie=omnomnom',
});
Run Code Online (Sandbox Code Playgroud)
(writable需要设置为true)
我试过了,它奏效了:
import Cookies from 'js-cookie';
Cookies.get = jest.fn()
.mockImplementation(() => 'fr');
Run Code Online (Sandbox Code Playgroud)
如果您想在每次调用时返回不同的值Cookies.get(),您可以这样做:
Cookies.get = jest.fn()
.mockImplementationOnce(() => 'en') // first time
.mockImplementationOnce(() => 'de'); // second time
Run Code Online (Sandbox Code Playgroud)
在 JEST 中使用setFilesAfterEnv选项时,将以下内容添加到定义的安装文件中效果很好。
无需任何模拟即可启用正常的 cookie 处理。
let __cookies;
Object.defineProperty( window.document, 'cookie', {
get: () => __cookies,
set: v => __cookies = v,
split: s => __cookies.split( s ),
} );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7796 次 |
| 最近记录: |