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

时间:2018-06-08 13:10:32

标签: 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'
}

现在我想在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
    })

5 个答案:

答案 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