Мокко это внутри обратного вызова - PullRequest
0 голосов
/ 20 июня 2019

Я новичок в mocha и node.

Я пытаюсь написать несколько тестов с использованием mocha, которые проверяют различные свойства сертификата SSL.У меня есть функция getCert, которая открывает сокет TLS.

Однако я не могу найти способ вызвать функцию один раз и выполнить несколько тестов мокко для обратного вызова из getCert.

Возможно ли это сделать?Вот мой код ...

var assert = require('chai').assert;
var tls = require('tls');
const moment = require('moment');

var hostToTest = 'www.google.com';

//this is based a little on https://www.npmjs.com/package/certificate-monitor
function getCert(host, port, callback) {
  let socketOptions = { 
    host: host, 
    port: port, 
    rejectUnauthorized: false,
    requestCert: true,
    agent: false,
    authorized: null,
    cert: null,
    error: null,
    daysRemaining: null
  };

  const socket = tls.connect(socketOptions, function() {
    socketOptions.authorized = socket.authorized;
    socketOptions.cert = socket.getPeerCertificate(true);
    var expireDate = new Date(socketOptions.cert.valid_to).toJSON();
    socketOptions.daysRemaining = moment(expireDate, moment.ISO_8601).diff(moment(), 'days');
    socket.end();
    callback(socketOptions);
  });

  socket.on('error', function (err){
    socketOptions.error = err;
    callback(socketOptions);
  });
}

//This works, but I have to call getCert multiple times
describe('TLS Certificate Checks 1', function() {
    it('Certificate should be trusted', function(done) {
        getCert(hostToTest, 443, function(certResponse){ 
            assert.isTrue(certResponse.authorized);
            done();
        });
    });

    it('Certificate should not be close to expirey', function(done) {
        getCert(hostToTest, 443, function(certResponse){ 
            assert.isAbove(certResponse.daysRemaining, 30);
            done();
        });
    });
});

//this does nothing... is it possible to call getcert just once?
describe('TLS Certificate Checks 2', function() {
  getCert(hostToTest, 443, function(certResponse){ 
    it('Certificate should be trusted', function(done) {
      assert.isTrue(certResponse.authorized);
      done();
    });

    it('Certificate should not be close to expirey', function(done) {
      assert.isBelow(certResponse.daysRemaining, 30);
      done();
    });
  });
});

Вот вывод кода выше:

$mocha testssl.js 


  TLS Certificate Checks 1
    ✓ Certificate should be trusted (56ms)
    ✓ Certificate should not be close to expirey


  2 passing (100ms)

1 Ответ

1 голос
/ 20 июня 2019

В Мокко есть нечто, что называется "Крючки". Вы можете вызвать метод getCert перед выполнением каждого теста.

describe('TLS Certificate Checks 2', function() {
  var certResponse = null;

  // THIS IS A HOOK
  beforeEach(function(done) {
    certResponse = null;

    // runs before each test in this block
    getCert(hostToTest, 443, function(result){
      certResponse = result;
      done();
    });
  });

  // PUT TEST CASES HERE
  it('Certificate should be trusted', function(done) {
    assert.isTrue(certResponse.authorized);
    done();
  });

  it('Certificate should not be close to expirey', function(done) {
    assert.isBelow(certResponse.daysRemaining, 30);
    done();
  });

});

beforeEach будет запускаться перед каждым тестом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...