【问题标题】:Testing Middleware and get TypeError: is not a function测试中间件并获取 TypeError: is not a function
【发布时间】:2018-08-29 21:04:54
【问题描述】:

我正在测试中间件功能并得到一个错误:

TypeError: *** 不是函数

我的 test.js

describe('Login', () => {
    it('it must check that function create the token', () => {
      const req = {
        body: { email: 'user@mail.com', password: '12345' }
      }
      const res = { locals: sinon.spy() }
      return authMiddleware.login(req, res)  // authMiddleware.test.js:41
        .then(res => {
          expect(res.locals.token).to.not.be.undefined;
        })
        .catch(err => console.log(err));
    });
  });

和中间件.js

module.exports = User => ({

  login(req, res, next) {
    if (!req.body.email || !req.body.password) return res.sendStatus(401);
    return User.findOne({ email: req.body.email })
      .then(user => {
        if (!user) return res.sendStatus(401);
        if (!user.isValidPassword(req.body.password)) return 
res.sendStatus(401);
        let payload = { id: user.id };
        let token = jwt.encode(payload, config.auth.jwtSecret);
        res.locals.token = token;
        next();
      })
      .catch(next);
  },
 });

错误:

TypeError: authMiddleware.login is not a function
at Context.it (test/api/middleware/authMiddleware.test.js:41:35)

我做错了什么?

【问题讨论】:

  • 什么是authMiddleware?它是否正确指向用户模块?
  • 该模块授权用户并将令牌传送给控制器。控制器为客户端发送令牌。
  • 你在测试中如何要求(authMiddleware)?不应该是 authMiddleware(user).login(...) 吗?
  • @SergeiR 你不懂,贴出你的完整代码吧。显然,您似乎没有导出/公开模块或正确要求它,这就是类型错误的原因
  • 是的错误是因为我没有发送 User => const authMiddleware = require('..../authMiddleware')(User);

标签: javascript testing mocha.js sinon chai


【解决方案1】:

您的middleware.js 文件导出一个接受User 参数的箭头函数。此函数的返回值是一个对象,该对象具有带有快速中间件签名的login 方法。

您应该像这样调用login 中间件:

const { login: loginMiddleware } = require('./middleware')(req.body);
loginMiddleware(req, res, next);

【讨论】:

    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2021-04-19
    • 2019-02-08
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多