繁体   English   中英

如何使用 sinon 在节点 js 中对 api 请求调用的 function 存根

[英]How to stub a function that was called on api request in node js using sinon

//routes.js
app.get('/:id/info',
    UnoController.getGameInfo,
    ...
);

//UnoController.js
async function getGameInfo(req, res) {
    data = await UnoModel.getGameInfo(req.params.id);
    if(data==null) return res.status(404).json({message:'Room Not Found'});
    res.json(data);
}


//UnoModel.js
exports.getGameInfo = async function (id) {
    return await mongodb.findById('uno', id);
}

我正在使用 sinon 在节点 js 中编写单元测试。
我希望存根 UnoModel.getGameInfo 返回{id:'123456789012'} ,当我点击/someid/info rest api 时。

我写了如下的测试用例。

//UnoApiTest.js
it('get game info with player payload and invalid room id', function (done) {
    sinon.stub(UnoModel, 'getGameInfo').resolves({ id: '123456789012' });
    request({
        url: 'http://localhost:8080/api/v1/game/uno/123456789012/info',
        headers: { 'x-player-token': jwt.sign({ _id: '123' }) }
    }, function (error, response, body) {
        expect(response.statusCode).to.equal(200);
        done();
    });
});

但我收到的 statusCode 为 404。
我试图安慰数据。 它实际上是从数据库中获取的。 它不返回为存根提供的值。
谁能帮我这个?
有没有其他方法可以做到这一点?

它应该工作。 例如

server.js

const express = require('express');
const UnoController = require('./UnoController');
const app = express();

app.get('/api/v1/game/uno/:id/info', UnoController.getGameInfo);

module.exports = app;

UnoController.js

const UnoModel = require('./UnoModel');

async function getGameInfo(req, res) {
  const data = await UnoModel.getGameInfo(req.params.id);
  if (data == null) return res.status(404).json({ message: 'Room Not Found' });
  res.json(data);
}

exports.getGameInfo = getGameInfo;

UnoModel.js

// simulate mongodb
const mongodb = {
  findById(arg1, arg2) {
    return { name: 'james' };
  },
};
exports.getGameInfo = async function(id) {
  return await mongodb.findById('uno', id);
};

UnoApiTest.test.js

const app = require('./server');
const UnoModel = require('./UnoModel');
const request = require('request');
const sinon = require('sinon');
const { expect } = require('chai');

describe('61172026', () => {
  const port = 8080;
  let server;
  before((done) => {
    server = app.listen(port, () => {
      console.log(`http server is listening on http://localhost:${port}`);
      done();
    });
  });
  after((done) => {
    server.close(done);
  });
  it('should pass', (done) => {
    sinon.stub(UnoModel, 'getGameInfo').resolves({ id: '123456789012' });
    request({ url: 'http://localhost:8080/api/v1/game/uno/123456789012/info' }, function(error, response, body) {
      expect(response.statusCode).to.equal(200);
      done();
    });
  });
});

API 自动化测试结果和覆盖率报告:

  61172026
http server is listening on http://localhost:8080
    ✓ should pass


  1 passing (50ms)

------------------|---------|----------|---------|---------|-------------------
File              | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------------|---------|----------|---------|---------|-------------------
All files         |      80 |       50 |   33.33 |   85.71 |                   
 UnoController.js |   83.33 |       50 |     100 |     100 | 5                 
 UnoModel.js      |      50 |      100 |       0 |      50 | 4,8               
 server.js        |     100 |      100 |     100 |     100 |                   
------------------|---------|----------|---------|---------|-------------------

源代码: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/61172026

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM