2015-04-29 3 views
0

У меня возникли проблемы с полным охватом в моем тестировании, где я пытаюсь использовать функцию обратного вызова внутри функции, которую я тестирую. Вот функция:Javascript unit tesing, проверка удара внутри функции возврата

CrowdControl.prototype.get = function() { 
    var options = this.optionsFor('GET'); 
    return q.Promise(function(resolve, reject) { 
     function callback(error, response, body) { 
      if (error) { 
       reject(error); 
      } else { 
       resolve(body); 
      } 
     } 

     request(options, callback); 
    }); 
}; 

Так у меня есть функция охватывает от за исключением функции обратного вызова:

function callback(error, response, body) { 
    if (error) { 
     reject(error); 
    } else { 
     resolve(body); 
    } 
} 

Я не могу показаться, чтобы выяснить, как ударить это с тестами.

Наверху у меня есть запрос затушил как этот

var request = sinon.stub(); 

beforeEach(function() { 
    CrowdControl = rewire('crowdcontrol'); 
    CrowdControl.__set__({ 
     request: request 
    }); 
}); 

Так что я не знаю, как я могу сделать это поражало обратный вызов и проверить, что. Мог бы использовать некоторое понимание, поскольку это все еще нова для меня. Благодаря!

Так что я пытаюсь простой тест сначала что-то вроде этого -

it("should call callback function.", function() { 
     crowdControl.get(); 
     //callback should fire? 
     expect(callback).to.have.been.called; 

    }); 

ответ

1

Простой способ добиться того, что вы хотите это:

CrowdControl.prototype.get = function(callback) { 
    callback = callback || function callback(error, response, body) { 
      if (error) { 
       reject(error); 
      } else { 
       resolve(body); 
      } 
     }; 
    var options = this.optionsFor('GET'); 
    return q.Promise(function(resolve, reject) { 

     callback(); 
     request(options, callback); 
    }); 
}; 

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

CrowdControl.get(someFakeFunction); 
+0

Я бы предпочел не организуйте функцию (поскольку я ее не создал, я просто пишу тесты для нее), если возможно – ajmajmajma

+0

Ну, во многих случаях вам нужно сделать какой-то рефакторинг, если вам действительно нужно покрыть каждую строку – maque

+0

Достаточно честно - спасибо! – ajmajmajma

0

При работе с функциями, которые возвращают обещание, вы должны сделать свой Утверждает (ожидать) находятся внутри, то(), так что это будет выглядеть примерно так:

it("should call callback function.", function(done) { 
var callback = sinon.stub();   
crowdControl.get(callback).then(function(){ 
     expect(callback).to.have.been.called; 
     done(); 
    }); 
+0

Итак, где будет определяться обратный вызов здесь, чтобы заглушить? Вернее - как обратный вызов в этом случае заштрихован? – ajmajmajma

+0

Я думаю, что лучший способ - определить ваш обратный вызов снаружи, как в ответе @garryp, а затем вызвать обратный вызов = sinon.stub() в вашем beaforeEach() и передать его команде crowdControl.get (callback) – maque