为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Jest 对复杂对象使用 Spies 和 Mock

使用 Jest 对复杂对象使用 Spies 和 Mock

慕盖茨4494581 2022-12-22 15:51:23
我对使用 Jest 为当前未发现的 javaScript 代码库进行测试和编写测试还很陌生。该代码涵盖了一些利基用例,因为它在页面加载期间由浏览器有条件地注入和执行。无论如何,我在模拟自定义对象时遇到了问题。这是有问题的功能:const setEnterpriseCookie = () => {        // Get the current page uri        let path = window.location.pathname;        // Matches all pages containing '/regex_expression'        if (path.match(/.*\/regex_expression.*/)) {            window.TOOL.cookie.setCookie(...args);        }    };据我了解,我需要模拟两者window.location.pathname以返回一个字符串,并且我需要模拟window.TOOL.cookie.setCookie()为模拟函数。这是我的测试尝试:var windowSpy;describe('Tests for the page-specific-methods.js file', () => {    beforeEach( () => {        windowSpy = jest.spyOn(global, 'window', 'get');    });    afterEach( () => {        windowSpy.mockRestore();    })    test('Test the page path detecting the enterprise string', () => {        windowSpy.mockImplementation( () => ({            location: {                pathname: '/enterprise/contact',            },            TOOL: {                cookie: {                    setCookie: jest.fn(),                },            },        }));        setEnterpriseCookie();                expect(window.TOOL.cookie.setCookie).toBeCalledTimes(1);        expect(window.TOOL.cookie.setCookie).toHaveBeenLastCalledWith(...args);    })});测试失败,表示window.TOOL.cookie.setCookie被调用了 0 次。我深入研究了这个过程,发现它window.location.pathname按预期执行,因此代码进入了调用window.TOOL.cookie.setCookie. 我认为问题出在我如何模拟的某个地方window.TOOL.cookie.setCookie,但我一直没能找到任何描述如何模拟如此之深的方法的帮助。先谢谢您的帮助!
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

只需使用Object.defineProperty()直接在window对象上定义属性。


例如


index.js:


const setEnterpriseCookie = (...args) => {

  let path = window.location.pathname;

  if (path.match(/.*\/enterprise.*/)) {

    window.TOOL.cookie.setCookie(...args);

  }

};


exports.setEnterpriseCookie = setEnterpriseCookie;

index.test.js:


const { setEnterpriseCookie } = require('./');


describe('63274598', () => {

  describe('Tests for the page-specific-methods.js file', () => {

    test('Test the page path detecting the enterprise string', () => {

      Object.defineProperty(window, 'location', {

        value: { pathname: '/enterprise/contact' },

      });

      Object.defineProperty(window, 'TOOL', {

        value: {

          cookie: {

            setCookie: jest.fn(),

          },

        },

      });

      setEnterpriseCookie('123');


      expect(window.TOOL.cookie.setCookie).toBeCalledTimes(1);

      expect(window.TOOL.cookie.setCookie).toHaveBeenLastCalledWith('123');

    });

  });

});

单元测试结果:


 PASS  stackoverflow/63274598/index.test.js (13.923s)

  63274598

    Tests for the page-specific-methods.js file

      ✓ Test the page path detecting the enterprise string (4ms)


----------|---------|----------|---------|---------|-------------------

File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 

----------|---------|----------|---------|---------|-------------------

All files |     100 |       50 |     100 |     100 |                   

 index.js |     100 |       50 |     100 |     100 | 3                 

----------|---------|----------|---------|---------|-------------------

Test Suites: 1 passed, 1 total

Tests:       1 passed, 1 total

Snapshots:   0 total

Time:        15.975s


查看完整回答
反对 回复 2022-12-22
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信