Cosa testare in questo modulo?

0

A parte le probabili dozzine di bug che puoi individuare nel codice qui sotto, mi piacerebbe davvero sapere che cosa la maggior parte delle persone considererebbe il test nel codice qui sotto. Ho 8 funzioni simili esportate, quindi credo che siano quelle che dovrei provare.

Il problema è che chiamano tutti la funzione privata sendTokBoxMessage , quindi non posso verificare che la funzione venga chiamata. Spostarlo nel proprio modulo sembra eccessivo poiché si tratta già di un piccolo modulo contenuto e aggiungere complessità per motivi di testing mi sembra sbagliato.

Stando così le cose, ho pensato di provare che la richiesta http che sendTokBoxMessage fa accadere. Ma questo chiama un'altra funzione privata getSessionIdForRoom , quindi ho bisogno di stubare roomStoreModel . Devo fare lo stesso per varie altre dipendenze (momento, apiKey, apiSecret) e quindi usare un finto framework http per spiare la richiesta.

Pensi che sia una buona pratica configurare tutto quanto sopra, o è l'opinione che se il modulo è abbastanza piccolo e abbastanza semplice, l'impostazione dei test è più impegnativa di quanto valga?

Grazie.

'use strict';
let request = require('request');
let moment = require('moment');
let jwt = require('jwt-simple');
let logger = require('../business/log_business');
let OpenTokConnection = require('../controllers/opentokConnection');
let ot = OpenTokConnection.ot;
let apiKey = OpenTokConnection.apiKey;
let apiSecret = OpenTokConnection.apiSecret;
let roomStoreModel = require('../model/roomstore_model')(ot, apiKey, apiSecret);

var getSessionIdForRoom = function(roomName) {
  return roomStoreModel.getSessionIdForRoom(roomName);
};

var createWebToken = function() {
  let now = moment().unix();
  let expires = now + 180;
  let claims = {'iss': apiKey, 'ist': 'project', 'iat': now, 'exp': expires, 'jti': 'jwt_corp'};
  let token = jwt.encode(claims, OpenTokConnection.apiSecret);

  return token;
};

var sendTokBoxMessage = function(roomName, endpoint, data) {
  getSessionIdForRoom(roomName).then(function(sessionId) {
    //Get the web token
    var webToken = createWebToken();

    //Set the headers
    var headers = {
      'X-OPENTOK-AUTH': webToken,
      'Content-Type': 'application/json'
    };

    // Configure the request
    var options = {
      url: 'https://api.opentok.com/v2/project/' + apiKey + '/session/' + sessionId + '/signal',
      method: 'POST',
      headers: headers,
      json: {'type': endpoint, 'data': JSON.stringify(data)},
      forever: true
    };

    // Start the request
    request(options, function(error, response) {
      if (error || response.statusCode !== 204) {
        logger.log('couldnt send tokbox message to endpoint, probably no one left to send to: ' + endpoint, roomName);
      }
    });
  });
};

exports.sendLogMessage = function(roomName, endPoint, data) {
  sendTokBoxMessage(roomName, endPoint, data);
};

exports.sendMessageToEveryone = function(roomName, endPoint, data) {
  sendTokBoxMessage(roomName, endPoint, data);
  logger.log('Sending message to everyone: ' + endPoint, 1, roomName);
};

exports.sendRestartRoomMessage = function(roomName) {
  sendTokBoxMessage(roomName, 'restartRoom', {'restart': 'restart'});
  logger.log('Sending restart room to everyone', 1, roomName);
};

exports.sendUserUpdateMessage = function(roomName, user, action) {
  var data = {'action': action, 'user': user};

  sendTokBoxMessage(roomName, 'userUpdated', data);
  logger.log('Sending userUpdated room to everyone: ' + user.uid, 1, roomName);
};

exports.sendRoomStateUpdateMessage = function(roomName, roomState) {
  sendTokBoxMessage(roomName, 'roomStateUpdate', roomState);
  logger.log('Sending roomState update to everyone: ' + JSON.stringify(roomState), 1, roomName);
};

exports.sendChatMessage = function(roomName, message) {
  sendTokBoxMessage(roomName, 'chatMessage', message);
  logger.log('Sending chat message: ' + JSON.stringify(message), 1, roomName);
};

exports.sendZipDxConnectedMessage = function(roomName) {
  sendTokBoxMessage(roomName, 'zipdxConnected', {'null': 'null'});
  logger.log('Sending ZipDx connected message', 1, roomName);
};

exports.sendZipDxDisconnectedMessage = function(roomName) {
  sendTokBoxMessage(roomName, 'zipdxDisconnected', {'null': 'null'});
  logger.log('Sending ZipDx disconnected message', 1, roomName);
};
    
posta Si-N 04.08.2017 - 11:34
fonte

1 risposta

4

È possibile testare solo il codice che è correttamente modularizzato. Il corretto test delle unità richiede sempre alcune concessioni nell'architettura del software. Ma di solito tendono a migliorare il tuo codice rendendolo più modulare e flessibile.

Il createWebToken deve essere testato per creare un oggetto claims corretto. Sfortunatamente questo è impossibile con il modo in cui è attualmente scritto, perché 1. dipende da moment().unix(); che ottiene da solo e 2. l'oggetto claims non lascia mai la funzione. Per renderlo testabile, dovresti estrarre la creazione dell'oggetto claims in una funzione separata che prende l'ora corrente come input. Quella funzione sarebbe quindi perfettamente testabile.

Simile a sendTokBoxMessage dovrebbe essere diviso in due funzioni. Una funzione createToxBoxRequest che restituisce una richiesta per un determinato roomSessionId, endpoint e dati. In questo modo puoi verificare che venga creata una richiesta corretta per ogni possibile input. La funzione effettiva sentToxBoxRequest prenderà quindi quell'oggetto ToxBoxRequest e lo invierà.

Ciò che rimane sono un insieme di funzioni che non sono altro che un involucro sottile per inviare XmlHttpRequest. C'è poco significato nel testare questi con un test unitario, perché si basano il 99,99% su un componente di rete. Ma se vuoi metterli alla prova, devi prendere in giro il sistema in cui i messaggi vengono inviati.

    
risposta data 04.08.2017 - 14:38
fonte

Leggi altre domande sui tag