gpt4 book ai didi

javascript - 未定义不是函数: unit testing passport authentication custom callback

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:30 24 4
gpt4 key购买 nike

我是 Passport 和 Express 的新手,并试图通过为我的所有代码创建单元测试来更好地了解一切如何协同工作。我一直取得了很好的成功,但今天遇到了一个我不太明白的问题......

我正在尝试在 session.js 上对以下导出函数进行单元测试:

'use strict';

var mongoose = require('mongoose'),
passport = require('passport');

exports.login = function (req, res, next) {
passport.authenticate('local', function(err, user, info) {
var error = err || info;
if (error) return res.json(401, error);

req.logIn(user, function(err) {

if (err) return res.send(err);
res.json(req.user.userInfo);
});
})(req, res, next);
};

我似乎在处理倒数第二行(req、res、next)以及如何/何时调用它时遇到问题。我也从未在 Javascript 中见过这种类型的调用,其中最后一行只是一组参数。

为了测试我正在使用 rewire 、诗农和摩卡。在我的测试中,我使用重新连接将 Passport 依赖项更改为我控制的模拟对象。

我的测试似乎按预期工作,正如它失败的地方以及 Istanbul 尔告诉我的内容所证明的那样,但它总是抛出:TypeError:未定义不是一个函数

如果我注释掉 session.js 中的 (req, res, next) 行,那么我的测试实际上会成功运行。

我的测试session.unit.js:

'use strict';

var rewire = require('rewire'),
should = require('should'),
sinon = require('sinon'),
sessionController = rewire('../../../../lib/controllers/session'),
passportMock = {};


describe('Session Controller', function() {

describe('#login', function(){

beforeEach(function(){
sessionController.__set__({
'passport': passportMock
});

});

it('should return 401 status and error if passport authentication returns error', function(){
//given
var res = {
json: sinon.spy(),
send: sinon.spy()
},
req = {
logIn: sinon.spy()
},
next = sinon.stub();

passportMock.authenticate = sinon.stub().callsArgWith(1, 'ERROR', null, null);

//when
sessionController.login(req, res, next);

//then
res.json.calledWith(401,'ERROR').should.be.true;
});

});

});

我的问题是:

  1. 最后一行(req、res、next)的用途是什么以及何时调用? (我怀疑是中间件)
  2. 有没有办法可以更改我的测试,使其在没有未定义错误的情况下通过?

非常感谢您的阅读以及您提供的任何帮助!

** 编辑: **我想我遗漏了一条关键信息......这个 session.login 函数是从我的 routes.js 文件中调用的,所以我相信中间件需要最后一行才能继续。不过,我仍然对如何允许它在单元测试中继续处理感到困惑。

routes.js 片段:

  app.route('/api/session')
.post(session.login)
.delete(session.logout);

** 编辑2: **

添加了 session.js 的顶部部分,以明确如何使用 require 最初声明 Passport 。在单元测试中,我通过用模拟( stub )对象重新连接来替换 Passport ,以便我可以控制 Passport 返回的内容。

最佳答案

我不确定这是否有帮助,但这通常是我 stub Passport 的方式。以与您相同的方式使用时进行身份验证。

var stub = sinon.stub(passport, 'authenticate').returns(function() {});
stub.yields(new Error('fails here'));

// add your tests here

stub.restore();

关于javascript - 未定义不是函数: unit testing passport authentication custom callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com