使用Jest模拟导入模块中的外部用户模块

时间:2018-08-13 15:09:36

标签: javascript jestjs

我不知道文档中是否缺少某些内容,但是我有这种情况:

// test.js

import User from './user'

it("should load initial data", async() => {
  const users = new User()
  const user = await users.load()
})

// User.js

import Api from './api'

export default class User {
  async load() {
    const res = await Api.fetch() // prevent/mock this in testing
  }
}

防止/模拟Api中的外部User.js模块的最简单方法是什么。我不希望User.js在测试中提出真实的网络请求。

此外,我正在寻找更通用的模拟解决方案,即。说我正在React Native中进行测试,例如,我想模拟NativeModules.SettingsManager.settings.AppleLocale。可以说Api.fetch()调用上面的行,并且没有发出HTTP请求

2 个答案:

答案 0 :(得分:3)

spyOnmock functions之类的mockImplementation结合使用将为您提供所需的内容。

这是一个有效的示例:

// ---- api.js ----
export const getData = () => {
  return Promise.resolve('hi');
}


// ---- user.js ----
import { getData } from './api'

export default class User {
  async load() {
    return await getData(); // mock this call in user.test.js
  }
}


// ---- user.test.js ----
import User from './user'
import * as Api from './api'; // import * so we can mock 'getData' on Api object

describe('User', () => {
  it('should load initial data', async() => {
    const mock = jest.spyOn(Api, 'getData'); // create a spy
    mock.mockImplementation(() => Promise.resolve('hello')); // give it a mock implementation

    const user = new User();
    const result = await user.load();
    expect(result).toBe('hello');  // SUCCESS, mock implementation called

    mock.mockRestore(); // restore original implementation when we are done
  });
});

答案 1 :(得分:0)

如果您需要模拟对HTTP请求的响应,则应签出nock。它具有干净的API,可为创建针对特定请求的HTTP响应提供很大的灵活性。