最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

网站源码admin21浏览0评论

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

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

这是我要测试的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
发布评论

评论列表(0)

  1. 暂无评论