如何测试返回带有参数的函数的函数?

时间:2018-07-24 01:01:37

标签: javascript node.js mocha

我想测试下面的代码,但是我不确定如何测试此函数,因为它返回带有参数的函数。您可以在图像中看到,我正在尝试实现100%的测试覆盖率,并且为此,我需要一个可以进入返回函数的测试。

const jwt = require('express-jwt')

function validateJwt (tokenConfig) {
  if (!tokenConfig || !tokenConfig.secret) {
    throw new TypeError('tokenConfig param must be defined and have attribute "secret"')
  }

  return (req, res, next) => {
    jwt(_.extend({}, tokenConfig, {
      requestProperty: 'tkn',
      getToken: ReqHelpers.getEitherTkn
    }))
  }
}

测试方法显然失败,并显示错误AssertionError: expected [Function] to be true

it('should succeed', () => {
  let result = middleware.validateJwt({secret: 'foo'})
  expect(result).to.be.true
})

enter image description here

2 个答案:

答案 0 :(得分:1)

对于这种测试,我们可以做的是监视jwt函数调用并检查其参数。

已更新:

由于express-jwt返回函数,我们需要涉及proxyquire来监视该函数。参考:https://github.com/thlorenz/proxyquire

您可以执行以下操作:

const proxyquire = require('proxyquire');
const sinon = require('sinon');

const jwtSpy = sinon.spy();
const middleware = proxyquire('./middleware', { 'express-jwt': jwtSpy }); // 'express-jwt' comes from your require statement for this package

it('should call jwt', () => {
  const req = sinon.spy();
  const res = sinon.spy();
  const next = sinon.spy();  

  middleware.validateJwt({secret: 'foo'})(req, res, next);

  expect(jwtSpy.called).to.be.ok;
  expect(jwtSpy.calledWithArg({ secret: 'foo', requestProperty: 'tkn'}).to.be.ok; // for checking the arguments
})

希望有帮助

答案 1 :(得分:0)

是的,有两件事。

首先,在测试中,您需要执行返回的函数,而不是直接对其进行测试。不幸的是,我正在使用手机,现在无法发布代码。

第二,返回的函数本身不会返回任何内容,因为它仅调用jwt函数。这不一定是问题。只要jwt()正在更新测试空间中的某些对象或变量,您就可以在测试中测试该obj / variable的当前状态,而不用直接询问该函数。