jest js 手动模拟链式方法
jest js manual mocking chained methods
我想用 jest 手动模拟 npm 模块 unirest。我创建了一个 __mocks__
并在其中放置了 unirest.js。我已经创建了 post 方法和 headers 方法,但我一直收到此错误。我如何创建这些链接方法并获得响应。
TypeError: unirest.post(...).headers is not a function
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;
有两个选项:
模拟测试的每个方法:这意味着,调用的第一个方法应该 return 一个包含第二个方法的假定义的对象,return 是一个定义第三个等等..
使用带有代理的模拟对象!
让我们看看第一种方法:你会做这样的事情...
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 returns an object with a function headers
, which is a function that returns an object with a函数 send
解析(不是 returns - resolves => 意味着将 return 一个值的承诺)到具有 属性 主体的对象,它将解析为任何内容你要。也许您想为每个测试自定义它。希望它能作为一般指南
Proxies 允许您在调用未定义的内容时执行 get
方法。这将允许您链接任何您想要的方法,并且对于特定的 send
return 有用的东西..它会是这样的:
const handler = {
get: (obj) => {
return obj
}
}
const send = jest.fn().mockResolvedValue({ body: FOO })
const target = { send }
module.exports = new Proxy(target, handler)
基本上,无论何时调用 unitest,它都会尝试在目标中执行。如果存在,它将 运行 代码。否则,它将调用代理中的 get
函数,这基本上会 return 对自身的引用(参数 obj
)。我没有使用过这种方法,但我相信它会起作用——你基本上模拟了你在 target
中关心的功能,而对于其余的,你只是“什么都不做”。如果链接太多并且您不关心对所有中间函数做任何断言,这可能很有用。
希望它能提供一些指导。
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
的帮助下,code.Thanks 的以下位终于让它工作了
我想用 jest 手动模拟 npm 模块 unirest。我创建了一个 __mocks__
并在其中放置了 unirest.js。我已经创建了 post 方法和 headers 方法,但我一直收到此错误。我如何创建这些链接方法并获得响应。
TypeError: unirest.post(...).headers is not a function
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;
有两个选项:
模拟测试的每个方法:这意味着,调用的第一个方法应该 return 一个包含第二个方法的假定义的对象,return 是一个定义第三个等等..
使用带有代理的模拟对象!
让我们看看第一种方法:你会做这样的事情...
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 returns an object with a function headers
, which is a function that returns an object with a函数 send
解析(不是 returns - resolves => 意味着将 return 一个值的承诺)到具有 属性 主体的对象,它将解析为任何内容你要。也许您想为每个测试自定义它。希望它能作为一般指南
Proxies 允许您在调用未定义的内容时执行 get
方法。这将允许您链接任何您想要的方法,并且对于特定的 send
return 有用的东西..它会是这样的:
const handler = {
get: (obj) => {
return obj
}
}
const send = jest.fn().mockResolvedValue({ body: FOO })
const target = { send }
module.exports = new Proxy(target, handler)
基本上,无论何时调用 unitest,它都会尝试在目标中执行。如果存在,它将 运行 代码。否则,它将调用代理中的 get
函数,这基本上会 return 对自身的引用(参数 obj
)。我没有使用过这种方法,但我相信它会起作用——你基本上模拟了你在 target
中关心的功能,而对于其余的,你只是“什么都不做”。如果链接太多并且您不关心对所有中间函数做任何断言,这可能很有用。
希望它能提供一些指导。
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
的帮助下,code.Thanks 的以下位终于让它工作了