You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:24:02