2015-05-21 2 views
0

У меня есть объект NetFlowStorage, содержащий методы для доступа к определенному индексу elasticsearch. Мой конструктор выглядит следующим образом:модульное тестирование вложенных объектов в javascript/node

function NetFlowStorage() { 
    this.host = 'localhost:9200'; 
    this.shards = '4'; 
    this.replicas = '0'; 
    this.index_name = 'flow_track2'; 
    this.client = null; 
} 

Внутри объекта У меня есть метод, называемый подключения, который при вызове будет делать соединение и хранить elasticsearch объект клиента в this.client собственности (если есть не один уже есть). Таким образом, все методы объекта могут получить доступ к клиенту elasticsearch с помощью this.client

Первый вопрос, это подходящий шаблон? Если нет, что предпочтительнее?

Второй вопрос (и тот, который меня потащил сюда), как бы я высмеивал звонки на такие вещи, как this.client.index({}) Я только начинаю возиться с модульным тестированием и издеваться над узлом/js, поэтому у меня действительно нет предпочтение в плане структуры (в настоящее время используется мокко/чай/синус)

Полный код here, если вы хотите увидеть более подробно.

+1

Эта статья может представлять интерес HTTP://www.clock.co.uk/blog/tools-for-unit-testing-and-quality-assurance-in-node-js –

ответ

1

Для чего-то вроде этого я бы использовал dependency injection.

Вы хотите разъединить NetFlowStorage класс от фактического клиента elasticsearch:

function NetFlowStorage(esClient) { 
    this.host = 'localhost:9200'; 
    this.shards = '4'; 
    this.replicas = '0'; 
    this.index_name = 'flow_track2'; 

    // if you don't wanna share connections across several instances 
    // you can instantiate the client here otherwise you can pass the 
    // client instance 
    this.client = esClient; // or new esClient({ host: this.host }) 
} 

Таким образом, вы даже не будете нуждаться в elasticsearch как часть узлового модуля и даже разделить соединение через более один экземпляр (или нет?)

Эта развязка также упростит насмешку esClient, поскольку вы будете вводить макет клиента elasticsearch в самом тесте.

+0

Является ли это предпочтительным шаблоном для этого типа вещей? – skarface

+1

Я бы сказал, что это хороший способ решить это. Затем вы можете абстрагироваться от всего этого уровня и иметь класс «EsNetFlowStorage», который расширяет базовый класс «NetFlowStorage» с клиентом ** elasticsearch ** и «RedisNetFlowStorage», если вы хотите иметь клиента redis. Вам просто нужно ввести другого клиента – Maroshii

1

Я думаю, что вы должны передать объект конфигурации и объект соединения методу. Так что, если вы будете использовать жасмин для тестирования, например, вы могли бы передать шпиона

var client = {index:function(){}} 
spyOn(client, 'index'); 
.... 
expect(client.index)toHaveBeenCalled(); 

и передать его в какой-то момент с инъекцией или одноточечного к SUT

Смежные вопросы