Как имитировать объект сеанса в приложении Compoundjs в node.js

У меня есть составное приложение js в node.js. Для некоторых действий у меня есть фильтр, проверяющий наличие значения «session.user», которое заполняется только после успешной аутентификации. Но всякий раз, когда вы пишете модульные тестовые примеры для таких действий, значение session.user становится неопределенным. Я использую модули supertest, sinon для получения и отправки запросов к действиям, но из-за неопределенного значения значения «session.user» он не проходит аутентификацию и перенаправляется на правильное действие. Пожалуйста, помогите мне, поскольку я застрял с тем же.

Пожалуйста, помогите мне, что именно мне нужно издеваться, чтобы я мог аутентифицировать значение session.user. Заранее спасибо,

ждем положительных ответов,

Спасибо,


person user2186466    schedule 09.04.2013    source источник
comment
У меня была аналогичная проблема. См. мой ответ stackoverflow.com/a/17732950/448876   -  person absynce    schedule 07.08.2013


Ответы (1)


Я использовал комбинацию фиктивного паспорта.

Это обеспечило две вещи:

  1. DRY — повторное использование кода beforeEach в тестах контроллера.
  2. Ненавязчивое тестирование — имитируйте паспорт.инициализировать, поэтому мне не пришлось изменять конфигурацию на основе тестирования.

В test/init.js я добавил метод имитации паспорта.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 для вызова в каждом контроллере:

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

Это будет вызываться в beforeEach каждого контроллера:

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