【问题标题】:How to stub a method that is indirectly called inside another method如何存根在另一个方法中间接调用的方法
【发布时间】:2018-07-30 10:40:16
【问题描述】:

我有一个节点/express REST API。 要测试我的 UsersController.login 方法,该方法将间接调用 dbConnector.readDoc() 函数,我需要对它进行存根。 但我还没有成功。存根永远不会被调用。

我的代码:

//test.spec.js

  const db = require('../../../api/api.dbConnectors/couchdb.connector');

  it('STUB should return 404 Error response if NON EXISTING username on DB (passw irrelevant)', function () {
      var req = httpMocks.createRequest({
          body: {
              username: "undefUsername",
              password: 'irrelevant'
          }
      });
      var res = httpMocks.createResponse({
        locals: {
          statusCode: 404,
          message: 'Request failed with status code 404',
        }
      });

  const stubedReadUser = sinon.stub(db, 'readDoc');
  // override behavior
  stubedReadUser.rejects();
  // const p = stubedReadUser.rejects(res);
  UsersController.userLogin(req, res);
  expect(stubedReadUser).to.have.been.calledOnce;

  stubedReadUser.restore();
});

// api路由

// FullPATH: /api/v1/users/...
// req.body = {username + password}
router.post('/login', UsersController.userLogin);

// 用户控制器.js

const db = require('../api.dbConnectors/api.db.connector');

function userLogin(req, res) {
  let user;
  let token;

  if (!ctrlHelpers.requestHasCredentials(req.body)) {
    return res.status(400).json({
      status: 400,
      message: 'Login failed: Bad request!',
    });
  }

  const userID = CONFIG.APP.USERS_NAMESPACE + req.body.username;
  db.readDoc('users', userID)
    .then((resp) => {
      // on success do something ...
    })
    .catch((err) => {
      return res.status(err.response.status).json({
        status: err.response.status,
        message: err.message,
      });
    });
}

// api.db.connector.js

// in the future will serve to select from MongoDB or CouchDB

const driver = require('./couchdb.connector');

module.exports = {
  createDoc: driver.createDoc,
  readDoc: driver.readDoc,
  updateDoc: driver.updateDoc,
  deleteDoc: driver.deleteDoc,
};

// couchdb.connector.js

module.exports = {
  readDoc,
  updateDoc,        
  (…)
};

async function readDoc(collection, docID) {
  const queryOptions = '?include_docs=true';
  const query = `${collection}${docID}${queryOptions}`;

  return axios.get(query);
}

希望有人可以帮助我吗?

【问题讨论】:

    标签: node.js rest testing sinon stub


    【解决方案1】:

    db 在测试模块中是 couchdb.connector,在 UsersController 模块中是 api.db.connector

    为了被存根,它应该被存根在同一个db对象上:

    const db = require('../../../api/api.dbConnectors/api.db.connector');
    ...
    const stubedReadUser = sinon.stub(db, 'readDoc');
    

    【讨论】:

    • 谢谢。不,它会被调用。
    • 是的,我的意思是“现在它被调用了”。对不起我的英语不好:(
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2015-06-16
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多