开玩笑js手册模拟链接方法

时间:2019-12-17 00:55:36

标签: node.js npm jestjs unirest

我想使用nest模块unirest开玩笑来手动模拟。我创建了一个__mocks__并将unirest.js放在其中。我已经创建了post方法和headers方法,但是我一直收到此错误。如何创建这些链接的方法并获得响应。

  

TypeError:unirest.post(...)。headers不是函数

unirest
  .post('http://mockbin.com/request')
  .headers({'Accept': 'application/json', 'Content-Type': 'application/json'})
  .send({ "parameter": 23, "foo": "bar" })
  .then((response) => {
    console.log(response.body)
  })

这是我的__mocks__/unirest.js

中的代码

const unirest = jest.genMockFromModule('unirest');

const result = {
    data: 'theresponse'
};

const myheaders = {'Accept': 'application/json', 'Content-Type': 'application/json'};

function headers(header) {
    header = myheaders;
    return header; 
}
console.log('inside uniREst promise mocker');

const post = opts => new Promise((resolve, reject) => {
    return resolve(result); 
  });

  

unirest.post = post;
unirest.headers = headers


module.exports = unirest;

2 个答案:

答案 0 :(得分:0)

有两种选择:

  • 模拟测试中的每个方法:这意味着,调用的第一个方法应返回一个对象,该对象包含第二个对象的伪定义,该对象返回第三个方法的定义,依此类推。 >

  • 使用带有代理的模拟对象!

让我们来看看第一种方法:您将执行以下操作...

const FOO = 'something useful for your tests'
const send = jest.fn().mockResolvedValue({ body: FOO })
const headers = jest.fn().mockReturnValue({ send })
const post = jest.fn().mockReturnValue({ headers })
jest.unirest = post

基本上,它是一系列函数:post返回带有函数headers的对象,这是一个返回带有函数send的对象的函数,该函数解析(不返回-resolves =>的含义具有属性主体的对象的承诺(将返回值),它将解析为所需的任何内容。也许您想针对每个测试进行自定义。希望它能作为一般指导方针

Proxies允许您在调用未定义的内容时执行get方法。这样一来,您就可以链接所需的任何方法,并且对于特定的send返回有用的信息..就像这样:

const handler = {
  get: (obj) => {
    return obj
  } 
}

const send = jest.fn().mockResolvedValue({ body: FOO })
const target = { send } 
module.exports = new Proxy(target, handler)

基本上,每当您调用unirest时,它将尝试在target中执行该操作。如果存在,它将运行代码。否则,它将调用代理中的get函数,该函数基本上将返回对自身的引用(参数obj)。我没有使用过这种方法,但我相信它会起作用-您基本上在target中模拟了您关心的功能,而其余的则只是“不执行任何操作”。如果链接太多,而您又不想在所有中间函数上进行任何断言,则这可能很有用。

希望它能提供一些方向。

答案 1 :(得分:0)

const Foo = {body: 'My response from API'};

function end(response) { 
    return response(Foo);
}
     
const send = req => {
    return { end };
}

const headers = opt => {
    return { send };
};

const post = url => {
    return { headers };
};

console.log('Calling mock unirest');

module.exports = {
    post: post,
    headers: headers, 
    send: send, 
    end: end
}

最后通过使用以下代码使其工作。感谢Gonzalo的帮助