как проектировать микросервисы с учетом тестирования - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть одна служба, которая вызывает другую службу, используя библиотеку cote.Я хотел бы знать, как спроектировать сервис так, чтобы он легко тестировался.

'use strict';

const logger = require('../../../helper/logger');
const Player = require('../../model/player_model/player_model');
const crypto = require('./../../../helper/crypto_helper');
const cote = require('cote');
let requester = new cote.Requester({name: 'findOnePlayer requester'});

/**
 * Creates new player in database
 * @param username / must be unique
 * @param password
 * @returns {Promise<Player>}
 */
module.exports.createPlayer = async (username, password) => {
  if (!(username && password && username.length && password.length)) {
    throw new Error('Both username and password are required');
  }


  const request = {type: 'findOnePlayer', username: username};
  const existingPlayer = await requester.send(request);

  if (existingPlayer) {
    throw new Error('Username is already taken');
  }


  const password_salt = crypto.genRandomString(16);
  /** Gives us salt of length 16 */
  const password_data = crypto.sha512(password, password_salt);

  const player = new Player({username: username, password_hash: password_data.password_hash, password_salt: password_data.salt});

  // save user
  return await player.save();
};

Я хотел бы высмеять этот метод const existingPlayer = await requester.send(request); объекта-запросчика.Но запрашивающий объект используется как конструктор с библиотекой cote.

Любая помощь или направление в том, что я должен искать / исследовать?

Спасибо

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете использовать Sinon.js ' Stubs , чтобы заглушить функцию send () запрашивающей стороны.

Я продемонстрирую на простом примере. Этот файл содержит и запросчик и ответчик и просто возвращает "bar". Он также экспортирует запросчик, так как нам нужен доступ к нему, чтобы заглушить его.

const cote = require('cote');

// Responder
const timeService = new cote.Responder({ name: 'Time Service' });
timeService.on('test', async () => {
    return 'bar'
});

// Requester
const requester = new cote.Requester({ name: 'Client' });
async function test() {
    return requester.send({ type: 'test' })
}

module.exports = { test, requester } // Export the requester

Реальные тесты тогда имеют доступ к запрашивающей стороне и могут использовать функции sinons stub(obj, "method") и stub.returns('whatever'):

const test = require('ava')
const sinon = require('sinon')
const foo = require('../')

test('test function should return bar when unstubbed and foo when stubbed', async t => {
    // Unstubbed call
    const returnValue = await foo.test()
    t.is(returnValue, 'bar')
    // Stub requester objects send function
    var stub = sinon.stub(foo.requester, "send");
    // Make it return whatever you like
    stub.returns('foo')
    // Test it
    const stubbedValue = await foo.test()
    t.is(stubbedValue, 'foo')
    // Remove the stub
    stub.restore();
    // Original unstubbed call
    const returnValue = await foo.test()
    t.is(returnValue, 'bar')
});

Ознакомьтесь с документами , поскольку вы также можете использовать stub.withArgs или stub.callsFake(fakeFunction), чтобы сделать его более гибким.

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