Синон шпион, поскольку обратный вызов не вызывается

У меня есть исходный файл, для которого я написал тестовые примеры.

var debug = require('debug')('kc-feed:source:fb');
var request = require('request');
var config = require('../../config').root;


exports.source = function fetchFeed (callback) {
  var params = {
      headers: {'content-type' : 'application/jsons'},
      url: config.host + "v1/social/fb/sync_feed", 
      method: 'GET'
  };

  request(params, function(err, body, response) {
    if(err) {
      callback(err);
    }
    else {
      var raw_data = JSON.parse(response);
      callback(null, raw_data);
    }
  });
};

Это мой тест мокко

var chai = require('chai'),
    expect = chai.expect,
    app = require('../app'),
    rewire = require('rewire'),
    fbfeed = rewire('../src/feed/source/fb_feed'),
    supertest = require('supertest'),
    sinon = require('sinon'),
    nock = require('nock');

describe('test cases for fb feed file', function() {
    var callback;
    beforeEach(function(){
        callback = sinon.spy();     
    });

    after(function(){
        nock.cleanAll();
    });

    it('callback should be called with the response', function(done) {
        nock('http://localhost:3000/')
            .get('/v1/social/fb/sync_feed') 
            .reply(200, {});
            callback = sinon.spy();
        fbfeed.source(callback);
        sinon.assert.calledOnce(callback);
        done();
    }); 

    it('callback should be called with the error', function(done) {
        nock('http://localhost:3000/')
            .get('/v1/social/fb/sync_feed') 
            .replyWithError(new Error('err'));
        fbfeed.source(callback);
        sinon.assert.calledOnce(callback);
        done();
    }); 

Оба моих тестовых примера терпят неудачу, поскольку в них говорится, что обратный вызов вызывается 0 раз. Но обратный вызов всегда вызывается. Пожалуйста помоги.


person krish    schedule 17.08.2016    source источник


Ответы (1)


Похоже, что запросы по-прежнему выполняются асинхронно (я не могу точно сказать, ожидается ли это при использовании nock), поэтому вы не можете использовать такие шпионы.

Вместо этого предоставьте обычный обратный вызов:

fbfeed.source(function(err, raw_data) {
  ...make your assertions...
  done();
});
person robertklep    schedule 17.08.2016
comment
it('обратный вызов должен быть вызван с ошибкой', function(done) { nock('localhost:3000/') .get('/v1/social/fb/sync_feed') .replyWithError(новая ошибка('ошибка')); '); Выполнено() }); }); я получаю сообщение об ошибке Uncaught AssertionError: ожидается, что [Error: err] будет равно 'err' - person krish; 17.08.2016
comment
err — это объект, а не строка. Попробуйте expect(err.message).to.equal('err'). - person robertklep; 17.08.2016
comment
Благодарность! оно работает. Я не понял типа ошибки. Теперь это работает @robertklep - person krish; 17.08.2016