NodeJS Mock第三方服务

时间:2018-08-16 12:04:46

标签: node.js ajax testing request

我有一个示例端点,当一个请求提交给它时,我向第三方服务发出另一个请求,该服务有时会出现故障。我想模拟该服务出现故障,以便我的测试可以进行。 这是一些示例代码

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服务的响应。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

只要可以运行测试,就可以在本地运行mock server并向本地模拟服务器请求。

查看json-servermockserver文档,以获取有关如何在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' });