Модульное тестирование NodeJS с Mocha, Chai и Sinon не удалось, результаты предыдущего теста не восстанавливаются

В довольно новом проекте, назначенном мне, где уже был написан некоторый код вместе с тестовыми примерами, некоторые существующие тестовые случаи внезапно начали неожиданно давать сбой, а заглушки не восстанавливались правильно.

Хуки beforeEach и afterEach набора тестов выглядят следующим образом:

var getTokenStub, paramDescStub, getDataStub, getCaseDesiredAction;

beforeEach(function () {
    getCaseDesiredAction = sinon.stub(pgUtils, 'getCaseDesiredAction');
    getDataStub = sinon.stub(apiCall, 'getData');
    getTokenStub = sinon.stub(apiCall, 'getToken');
    paramDescStub = sinon.stub(paramDesc, 'getParameterDescriptionForCode')
});

afterEach(function () {
    pgUtils.getCaseDesiredAction.restore();
    apiCall.getData.restore();
    apiCall.getToken.restore();
    paramDesc.getParameterDescriptionForCode.restore();
});
....

Затем следует несколько тестовых случаев, которые проверяют наличие ошибок.

Это должно пройти с ответом об ошибке

 ....
 it('should respond with error if query fails', (function (done) {
    var req = {
        query: {caseId: '12345'},
    };
    getTokenStub.yields(200, '"Token"');
    getDataStub.yields(200, sampleDetailsResponse);
    getCaseDesiredAction.yields('error', null);
    getCaseDetails(req, res);
    res.response.errorCode.should.equal(1234);
    res.response.msg.should.equal('caseDetailsResult Failed while getting desired action: error');
    done();
}));
....

Проблема в том, что даже следующий тест-кейс не проходит с теми же ошибками, что и предыдущие. Например: - В следующем случае тоже происходит сбой с ошибкой 'caseDetailsResult Failed while getting desired action: error', хотя все входные данные для него верны. Если я закомментирую тестовые примеры, которые проверяют ошибочные входные данные/состояния, следующие случаи будут работать правильно.

Это должно быть пройдено с ответом об успешном завершении (но оно не будет выполнено с той же ошибкой, что и в предыдущем тестовом примере)

 it('should respond with case details', (function (done) {
    var req = {
        query: {caseId: '12345'},
        session: {
            "authenticatedUser": {userId: "999999999"}
        }
    };
    getTokenStub.yields(200, '"Token"');
    getCaseDesiredAction.yields(null, [{desiredaction: 'Close'}]);
    paramDescStub.yields('TEST CODE');
    getDataStub.yields(200, sampleDetailsResponse);
    getCaseDetails(req, res);
    res.response.should.eql({
        caseDetails:
            {
             ....  
            }
        success: 'true'
    });
    done();
}));

Я весь в море, пытаясь найти, что здесь происходит не так. Есть и другие файлы в том же формате, но они исправны. Может ли кто-нибудь помочь мне выяснить проблему с этим?

ПРИМЕЧАНИЕ. Здесь следует отметить, что недавно мы добавили функцию async.map в исходный файл.

ОБНОВЛЕНИЕ: Вот полный фрагмент кода для спецификации

describe('getCaseDetails', function () {
  var res = {
      response: {},
      send: function (values) {
        this.response = values;
      }
  };

  var getCaseDesiredAction;
  var getDataStub;
  var getTokenStub, paramDescStub;

  beforeEach(function () {
      getCaseDesiredAction = sinon.stub(pgUtils, 'getCaseDesiredAction');
      getDataStub = sinon.stub(apiCall, 'getData');
      getTokenStub = sinon.stub(apiCall, 'getToken');
      paramDescStub = sinon.stub(paramDesc, 'getParameterDescriptionForCode')
  });

  afterEach(function () {
      pgUtils.getCaseDesiredAction.restore();
      apiCall.getData.restore();
      apiCall.getToken.restore();
      paramDesc.getParameterDescriptionForCode.restore();
  });

  // passes with error response invalid input
  it('should return an error if an input is missing', function (done) {
      var req = {
          query: {},
          session: {}
      };
      getCaseDetails(req, res);
      res.response.msg.should.equal("Invalid input");
      done();
  });

  ....

  ....
  // passes with error response 'Failed while getting desired action'
  it('should respond with error if query fails', (function (done) {
      var req = {
          query: {caseId: '12345'},
      };
      getTokenStub.yields(200, '"Token"');
      getDataStub.yields(200, sampleDetailsResponse);
      getCaseDesiredAction.yields('error', null);
      getCaseDetails(req, res);
      res.response.errorCode.should.equal(1234);
      res.response.msg.should.equal('caseDetailsResult Failed while getting desired action: error');
      done();
  }));

  ....
  ....

  it('should respond with case details', (function (done) {
      var req = {
          query: {caseId: '12345'},
          session: {
              "authenticatedUser": {userId: "999999999"}
          }
      };
      getTokenStub.yields(200, '"Token"');
      getCaseDesiredAction.yields(null, [{desiredaction: 'Close'}]);
      paramDescStub.yields('TEST CODE');
      getDataStub.yields(200, sampleDetailsResponse);
      getCaseDetails(req, res);
      res.response.should.eql({
          caseDetails:
              {
               ....  
              }
          success: 'true'
      });
      done();
  }));
});

person Kumar Divya Rajat    schedule 04.04.2018    source источник
comment
Тот факт, что ваши beforeEach и afterEach определены за пределами блока описания, вызывает подозрения... если только вы не показываете там весь код? может быть, было бы полезно, если бы вы разместили весь файл дословно.   -  person Mike Atkins    schedule 05.04.2018
comment
Хуки beforeEach и afterEach находятся внутри блока описания. Я обновил вопрос структурированным фрагментом для спецификации.   -  person Kumar Divya Rajat    schedule 05.04.2018


Ответы (1)


Ваш объект res переносит состояние из одного теста в другой. Вы должны инициализировать его в своем beforeEach, а не непосредственно в блоке описания.

person sripberger    schedule 05.04.2018