Как настроить тесты Mocha с Node.js и Passport
Как в приложении, построенном с Node.js (CompoundJS + PassportJS), как тесты Mocha могут выполняться на контроллерах, которые заблокированы и требуют входа в систему? Я пытался использовать Superagent, но мне не очень повезло, и чтобы использовать его, сервер должен быть запущен для запуска тестов. Я'мы очень близко подошли к этому методу, но нене нужно, чтобы сервер работал для запуска модульных тестов.
Я также попытался в том числе паспорт и использованиеrequest.login
метод, я оказался в точке, где я продолжал получать ошибкуpassport.initialize()
промежуточное программное обеспечение не используется.
Я пытаюсь придерживаться сгенерированных тестов CompoundJS, которые прекрасно работали, пока не включилась аутентификация. Тесты CompoundJS по умолчанию запускаютinit.js
файл, в котором будет удобно обрабатывать аутентификацию и каким-то образом сделать доступным для каждого теста контроллера:
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;
};
Контроллеры / 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 200
или жеAssertionError: expected false to be true