我有一个示例端点,当一个请求提交给它时,我向第三方服务发出另一个请求,该服务有时会出现故障。我想模拟该服务出现故障,以便我的测试可以进行。 这是一些示例代码
it('should handle malfunctional 3rd party service', done => {
Frisby.post(Endpoints.randomEndpoint, {
email: 'johndoe@gmail.com',
firstName: 'John',
lastName: 'Doe'
})
.expect('status', 400)
.expect('jsonTypes', Common.Types.ErrorModel)
.done(done);
});
在服务器端,我有类似的东西。
app.post('randomEndpoint', (req, res) => {
request('http://3rdpaty.com/api')
.then(data => {
res.send(200);
})
.catch(err => {
res.send(500);
})
})
我的目标是模拟来自顶级Pary服务的响应。有什么想法吗?
答案 0 :(得分:3)
只要可以运行测试,就可以在本地运行mock server
并向本地模拟服务器请求。
查看json-server或mockserver文档,以获取有关如何在node.js中运行模拟服务器的说明
在本地运行模拟服务器(根据mockserver):
var http = require('http');
var mockserver = require('mockserver');
http.createServer(mockserver('mocks')).listen(9001);
将文件添加到mocks/api
目录中,命名为GET.mock
(对于GET
请求)或POST.mock
(对于POST
请求),并指定结果API调用:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
{
"Accept-Language": "en-US,en;q=0.8",
"Host": "headers.jsontest.com",
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"Accept":
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}
每当运行测试时(使用模拟服务器的端口)更改第三方服务器的URL:
app.post('randomEndpoint', (req, res) => {
request('http://127.0.0.1:9001/api')
.then(data => {
res.send(200);
})
.catch(err => {
res.send(500);
})
})
更改第三方URL的更好解决方案是使用env变量指定TEST
环境,并根据程序运行的环境使用配置文件获取URL。例如如果您的程序在Production
环境下运行,则URL必须为http://3rdpaty.com/api
,但是如果您的程序在TEST
环境下运行,则URL必须为http://127.0.0.1:9001/api
。
答案 1 :(得分:0)
您可以使用nock library
模拟您的http请求nock('http://3rdpaty.com/')')
.post('/api/', {
email: 'johndoe@gmail.com',
firstName: 'John',
lastName: 'Doe'
})
.reply(400, { id: '123ABC' });