2015-12-01 3 views
0

Это мое первое экспресс-приложение, и у меня возникли проблемы с написанием тестов для конечных точек.Mocha- Testing Express API с глобальным промежуточным ПО

В данный момент я не использую базу данных для хранения жетонов или проверки для пользователей при входе в систему.

тестирования я написал пропуск, однако они не являются полными. Как я могу проверить, например, пользователя, который прошел аутентификацию правильно?

Как бы я искал процесс аутентификации?

Поскольку я создал глобальную функцию промежуточного программного обеспечения и функцию checkLoging, как включить их в мои тесты?

Как проверить аутентификацию и маршруты?

Это мой код:

'use strict'; 

var express = require('express'); 
var session = require('express-session'); 
var app = express(); 
var shopifyObj = require('shopify-node'); 
var shopifyConfig = require("./config/config.json"); 
var _ = require('underscore'); 
var shopify = require('./lib/modules/shopify'); 
var product = require('./lib/modules/product'); 

var fakeDta = { 
    user: 'Simba', 
}; 

app.use(session({ 
    secret: 'dsjkfhklaf', 
    resave: false, 
    saveUninitialized: true 
})); 

// Set global middleware function to check for sessions 
app.use(function(req, res, next) { 
    if (req.session && req.session.user) { 
     // check here for the existence of this user and token in the database. 
     next(); 

    } else { 
     next(); 
    } 
}); 

// define middleware function 
function checkLogin (req, res, next) { 
    if (!req.session.user) { 
     req.session.error = 'Access denied!'; 
     res.redirect('/auth'); 
    } else { 
     next(); 
    } 
}; 

app.get('/auth', function (req, res) { 
    var url = shopify.createURL(); 
    res.redirect(url); 
}); 

app.get('/handle-o-auth-response', function (req, res) { 
    var code = req.query.code; 
    _.extend(shopifyConfig, {'code': code}); 
    shopify.setAccessCode(code, res, function (err, token) { 
     if (err) { 
      res.redirect('/auth'); 
     } else { 
      _.extend(shopifyConfig, {'access_token': token}); 
      req.session.user = fakeDta.user; 
      res.redirect('/products'); 
     } 
    }); 
}); 

app.get('/products', checkLogin, function (req, res) { 

    shopify = new shopifyObj(shopifyConfig); 

    product.getProducts(shopify, res); 

}); 

var server = app.listen(3000, function() { 
    var host = server.address().address; 
    var port = server.address().port; 

    console.log('App listening at http://%s:%s', host, port); 
}); 

module.exports = server; 

Это мои тесты:

"use strict"; 

var supertest = require("supertest"); 

describe("Testing server",function(){ 
    var server; 

    beforeEach(function() { 
     /* Node module system caches the evaluated result of each module 
     to avoid loading and compiling the same javascript file multiple times. 
     Thus the server instance from app.js is only created once. 
     */ 
     delete require.cache[require.resolve('../app.js')]; 
     server = require('../app.js'); 
    }); 

    afterEach(function (done) { 
     server.close(done); 
    }); 

    it("should redirect to /auth",function(done){ 
     supertest(server) 
      .get("/products") 
      //.expect("Content-type",/json/) 
      .expect(302, done); 
    }); 

    it("should redirect to shopify",function(done) { 
     supertest(server) 
      .get("/auth") 
      //.expect("Content-type",/json/) 
      .expect(302, done); 
    }); 
}); 

ответ

1

Что бы я сделать, это реорганизовать код для поддержки насмешливый или заменив функцию checkLogin.

Вы можете сделать это, выставив функцию checkLogin на экспортированном объекте из app.js, но это будет не очень чисто архитектурно.

В качестве альтернативы вы можете отделить функцию checkLogin из-за его собственный файл, а вместо экспорта:

module.exports = server; 

создать функцию, которая принимает функцию checkLogin, которая оборачивает весь код, который использует функцию checkLogin:

var express = require('express'); 
// skipped require code... 
var product = require('./lib/modules/product'); 

function init(checkLogin) { 

    var fakeDta = { 
     user: 'Simba', 
    }; 

    // skipped code... 

    // remove the checkLogin function definition! 

    // skipped code... 

    return app.listen(3000, function() { 
     var host = server.address().address; 
     var port = server.address().port; 

     console.log('App listening at http://%s:%s', host, port); 
    }); 
}; 

module.exports = init; 

Теперь в вашем живом коде вам нужен файл с функцией checkLogin, и передать функцию на сервер, а в вашем тестовом коде вы можете предоставить макетную функцию, которая будет вести себя точно так, как вы хотите в своем тесте, например, возвращая T hat логин действителен.

Вы можете либо написать свою собственную функцию и передать ее, либо использовать насмешливую библиотеку, такую ​​как sinon.

0

У меня есть JSon конфигурационных файлы каждый для окр: тест, Dev, прод и конфигурация загрузчик, который возвращает конфигурационное базирование на текущем NODE_ENV:

let ENV = process.env.NODE_ENV; 
let env = ENV || 'prod'; 

module.exports = require('./' + env + '.json'); 

В промежуточной авторизации:

if(config.env != 'prod' && process.env.DISABLE_AUTORIZATION) return next(); 

Теперь я могу отключить авторизацию в промежуточном программном средстве в среде тестирования и dev, установив переменную DISABLE_AUTHORIZATION следующим образом:

process.env.DISABLE_AUTORIZATION = true; 

PS. Чтобы установить NODE_ENV, я использую пакет cross-env. Мои сценарии:

"scripts": { 
    "start": "node server.js", 
    "dev": "cross-env NODE_ENV=dev node server.js", 
    "test": "mocha --timeout 10000" 
    }, 
Смежные вопросы