gpt4 book ai didi

node.js - 如何使用 Node.js 和 Passport 设置 Mocha 测试

转载 作者:搜寻专家 更新时间:2023-11-01 00:02:40 26 4
gpt4 key购买 nike

在使用 Node.js(CompoundJS + PassportJS)构建的应用程序中,如何在锁定且需要登录的 Controller 上运行 Mocha 测试?我曾尝试使用 Superagent,但运气不佳,要使用它,服务器需要运行才能运行测试。我已经非常接近这种方法,但不想让服务器运行才能运行单元测试。

我还尝试包含 Passport 并使用 request.login 方法,但最终我一直收到错误 passport.initialize() middleware not in use .

我试图坚持使用生成的 CompoundJS 测试,这些测试在涉及身份验证之前一直运行良好。默认的 CompoundJS 测试运行一个 init.js 文件,它可以很好地处理身份验证并以某种方式提供给每个 Controller 测试:

require('should');
global.getApp = function(done) {
var app = require('compound').createServer()
app.renderedViews = [];
app.flashedMessages = {};

// Monkeypatch app#render so that it exposes the rendered view files
app._render = app.render;
app.render = function(viewName, opts, fn) {
app.renderedViews.push(viewName);

// Deep-copy flash messages
var flashes = opts.request.session.flash;
for (var type in flashes) {
app.flashedMessages[type] = [];
for (var i in flashes[type]) {
app.flashedMessages[type].push(flashes[type][i]);
}
}

return app._render.apply(this, arguments);
}

// Check whether a view has been rendered
app.didRender = function(viewRegex) {
var didRender = false;
app.renderedViews.forEach(function(renderedView) {
if (renderedView.match(viewRegex)) {
didRender = true;
}
});
return didRender;
}

// Check whether a flash has been called
app.didFlash = function(type) {
return !!(app.flashedMessages[type]);
}

return app;
};

controllers/users_controller_test.js

var app,
compound,
request = require('supertest'),
sinon = require('sinon');

/**
* TODO: User CREATION and EDITs should be tested, with PASSPORT
* functionality.
*/

function UserStub() {
return {
displayName: '',
email: ''
};
}

describe('UserController', function() {
beforeEach(function(done) {
app = getApp();
compound = app.compound;
compound.on('ready', function() {
done();
});
});

/**
* GET /users
* Should render users/index.ejs
*/
it('should render "index" template on GET /users', function(done) {
request(app)
.get('/users')
.end(function(err, res) {
res.statusCode.should.equal(200);
app.didRender(/users\/index\.ejs$/i).should.be.true;
done();
});
});

/*
* GET /users/:id
* Should render users/index.ejs
*/
it('should access User#find and render "show" template on GET /users/:id',
function(done) {
var User = app.models.User;

// Mock User#find
User.find = sinon.spy(function(id, callback) {
callback(null, new User);
});

request(app)
.get('/users/42')
.end(function(err, res) {
res.statusCode.should.equal(200);
User.find.calledWith('42').should.be.true;
app.didRender(/users\/show\.ejs$/i).should.be.true;

done();
});
});
});

这些都失败了 AssertionError: expected 403 to equal 200AssertionError: expected false to be true

最佳答案

我在复合配置事件上结合使用了模拟 passport.initialize、测试助手和监听器。

这提供了两件事:

  1. DRY - 在 Controller 测试中重用 beforeEach 代码。
  2. 非侵入式测试 - 模拟 passport.initialize,这样我就不必根据测试修改配置。

在 test/init.js 中我添加了模拟 passport.initialize 的方法**:

** 发现于:

http://hackerpreneurialism.com/post/48344246498/node-js-testing-mocking-authenticated-passport-js

// Fake user login with passport.
app.mockPassportInitialize = function () {
var passport = require('passport');
passport.initialize = function () {
return function (req, res, next) {
passport = this;
passport._key = 'passport';
passport._userProperty = 'user';
passport.serializeUser = function(user, done) {
return done(null, user.id);
};
passport.deserializeUser = function(user, done) {
return done(null, user);
};
req._passport = {
instance: passport
};
req._passport.session = {
user: new app.models.User({ id: 1, name: 'Joe Rogan' })
};

return next();
};
};
};

然后我添加了一个 helpers.js 文件在每个 Controller 中调用:

module.exports = {
prepApp: function (done) {
var app = getApp();
compound = app.compound;
compound.on('configure', function () { app.mockPassportInitialize(); });
compound.on('ready', function () { done(); });
return app;
}
};

这将在每个 Controller 的 beforeEach 中调用:

describe('UserController', function () {
beforeEach(function (done) {
app = require('../helpers.js').prepApp(done);
});
[...]
});

关于node.js - 如何使用 Node.js 和 Passport 设置 Mocha 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555703/

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