如何使用proxyquire模拟“请求”

问题描述

我有一个文件 foo.js


var request = require('request');

module.exports.getRequest = function (url,headers) {
    return new Promise((resolve,reject) => {
        request(
            {
                url: url,method: "GET",timeout: 30000,headers: headers,},function (error,response,body) {
                if (error) {
                    reject(error);
                }
                resolve({response,body});
            }
        );
    });
};

我想为它写一个测试用例。但我不能写。 有人可以帮忙吗? 我试过这样的事情。

var proxyquire = require('proxyquire'),assert = require('assert'),pathStub = {};

describe('Test',() => {

    it('1',() => {
        var foo = proxyquire('./foo',{'request': pathStub});

        pathStub.request = function (file,option) {
            console.log("Request Stub");
            option(null,"a","b");
        };

        let b = foo.getRequest('file.txt');
        assert.strictEqual(foo.getRequest('file.txt'),'EXTERMINATE,EXTERMINATE THE FILE.TXT');
    });
});

错误 - (node:15344) UnhandledPromiseRejectionWarning: TypeError: request is not a function

解决方法

您没有正确存根 request 函数。

例如

foo.js

var request = require('request');

module.exports.getRequest = function (url,headers) {
  return new Promise((resolve,reject) => {
    request(
      {
        url: url,method: 'GET',timeout: 30000,headers: headers,},function (error,response,body) {
        if (error) {
          reject(error);
        }
        resolve({ response,body });
      },);
  });
};

foo.test.js

var proxyquire = require('proxyquire'),assert = require('assert');

describe('Test',() => {
  it('1',async () => {
    const requestStub = function (option,callback) {
      console.log('Request Stub');
      callback(null,'a','b');
    };
    var foo = proxyquire('./foo',{ request: requestStub });

    var actual = await foo.getRequest('file.txt');
    assert.deepStrictEqual(actual,{ response: 'a',body: 'b' });
  });
});

单元测试结果:

  Test
Request Stub
    ✓ 1 (1378ms)


  1 passing (1s)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   85.71 |       50 |     100 |   85.71 |                   
 foo.js   |   85.71 |       50 |     100 |   85.71 | 14                
----------|---------|----------|---------|---------|-------------------

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...