我不知道文档中是否缺少某些内容,但是我有这种情况:
// 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请求
答案 0 :(得分:3)
spyOn与mock 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响应提供很大的灵活性。