如何在jasmine中模拟request请求,完成目标函数的单元测试
用Jasmine模拟request请求测试getProducts函数的方案
我们通过Jasmine的Spy功能替换原生request.get方法,拦截真实网络请求,手动控制回调的入参,即可覆盖所有分支场景:
- 场景1:请求抛出错误时,getProducts应reject对应的错误
- 场景2:接口返回
value=yes时,getProducts应resolve为1 - 场景3:接口返回
value≠yes时,getProducts应resolve为0
具体测试代码
首先在测试文件头部引入依赖:
const request = require('request'); const { getProducts } = require('./你存放getProducts的文件路径');
完整测试用例如下:
describe('getProducts 单元测试', () => { // 每个测试用例执行前劫持request.get,避免发送真实网络请求 beforeEach(() => { spyOn(request, 'get'); }); // 测试用例1:请求报错场景 it('请求发生错误时应当reject对应错误', async () => { const mockError = new Error('网络请求失败'); // 手动调用request.get的回调,传入模拟错误参数 request.get.and.callFake((options, callback) => { callback(mockError, null, null); }); await expectAsync(getProducts()).toBeRejectedWith(mockError); }); // 测试用例2:返回value=yes的场景 it('接口返回value为yes时应当resolve为1', async () => { const mockBody = JSON.stringify({ value: 'yes' }); request.get.and.callFake((options, callback) => { callback(null, {}, mockBody); }); const res = await getProducts(); expect(res).toBe(1); // 可选:校验函数调用request时的url参数是否符合预期 expect(request.get).toHaveBeenCalledWith(jasmine.objectContaining({ url: 'http://ascott.com/products' }), jasmine.any(Function)); }); // 测试用例3:返回value不为yes的场景 it('接口返回value不为yes时应当resolve为0', async () => { const mockBody = JSON.stringify({ value: 'no' }); request.get.and.callFake((options, callback) => { callback(null, {}, mockBody); }); const res = await getProducts(); expect(res).toBe(0); }); });
低版本Jasmine兼容写法
如果你使用的Jasmine版本不支持expectAsync语法,可以用done回调实现异步测试,示例如下:
it('接口返回value为yes时应当resolve为1', (done) => { const mockBody = JSON.stringify({ value: 'yes' }); request.get.and.callFake((options, callback) => { callback(null, {}, mockBody); }); getProducts().then(res => { expect(res).toBe(1); done(); }).catch(err => done.fail(err)); });
内容的提问来源于stack exchange,提问作者cam
相关产品推荐
相关产品推荐

