如何在JEST中模拟Cookie.get('language')

Ki*_*aya 6 javascript jestjs

我有一个功能,可以在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)

And*_*rle 9

您需要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)


ifl*_*flp 7

无需下载任何部门,只需使用:

Object.defineProperty(window.document, 'cookie', {
            writable: true,
            value: 'myCookie=omnomnom',
        });
Run Code Online (Sandbox Code Playgroud)

writable需要设置为true)


mis*_*ggy 5

我试过了,它奏效了:

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)


Mat*_*ipe 5

在 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)