如何在玩笑测试中模拟外部函数调用

编程入门 行业动态 更新时间:2024-10-09 15:24:31

如何在玩笑测试中模拟外部<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数调用"/>

如何在玩笑测试中模拟外部函数调用

这是我要测试的Node.js模块(userdata.js文件):

const myService = require('./my-service')

class UserData {
  getData(query) {
    return new Promise((resolve, reject) => {
      myService.getUserData(query)
        .then((userdata) => {
          myService.getManagerData(userdata)
            .then((managerdata) => {
              resolve(managerdata)
            })
        })
    })
  }
}
module.exports = UserData

和测试文件:

const UserData = require('/.userdata')
test('UserData.getData', () => {
  expect(UserData.getData('John Smith')).toBe('John\' manager');
});

我想模拟未在测试文件中直接声明的myService.getUserData和/或myService.getManagerData函数调用。如何正确模拟它们以返回一些虚拟结果?

回答如下:

您可以使用jest.spyOn(object, methodName)为myService.getUserDatamyService. getManagerData方法创建存根。

例如

userData.js

const myService = require('./myService');

class UserData {
  getData(query) {
    return new Promise((resolve, reject) => {
      myService.getUserData(query).then((userdata) => {
        myService.getManagerData(userdata).then((managerdata) => {
          resolve(managerdata);
        });
      });
    });
  }
}

module.exports = UserData;

myService.js

const myService = {
  getUserData(query) {
    return 'real user data';
  },
  getManagerData(userdata) {
    return 'real manager data';
  },
};

module.exports = myService;

userData.test.js

const UserData = require('./userData');
const myService = require('./myService');

describe('61784452', () => {
  afterEach(() => {
    jest.restoreAllMocks();
  });
  it('should pass', async () => {
    jest.spyOn(myService, 'getUserData').mockResolvedValueOnce('fake user data');
    jest.spyOn(myService, 'getManagerData').mockResolvedValueOnce('fake manager data');
    const userData = new UserData();
    const actual = await userData.getData('query');
    expect(actual).toEqual('fake manager data');
    expect(myService.getUserData).toBeCalledWith('query');
    expect(myService.getManagerData).toBeCalledWith('fake user data');
  });
});

带有覆盖率报告的单元测试结果:

 PASS  stackoverflow/61784452/userData.test.js (12.908s)
  61784452
    ✓ should pass (5ms)

--------------|---------|----------|---------|---------|-------------------
File          | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
--------------|---------|----------|---------|---------|-------------------
All files     |   84.62 |      100 |   71.43 |   84.62 |                   
 myService.js |      50 |      100 |       0 |      50 | 3-6               
 userData.js  |     100 |      100 |     100 |     100 |                   
--------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        13.99s

更多推荐

如何在玩笑测试中模拟外部函数调用

本文发布于:2024-05-07 13:44:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756512.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   玩笑   如何在   测试中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!