【问题标题】:NodeJS Unit testing with Mocha, Chai and Sinon failing with results from previous test not being restored使用 Mocha、Chai 和 Sinon 进行 NodeJS 单元测试失败,之前测试的结果未恢复
【发布时间】:2018-04-04 23:01:48
【问题描述】:

在分配给我的一个相当新的项目中,已经编写了一些代码和测试用例,一些现有的测试用例突然开始意外失败,存根没有正确恢复。

测试套件的 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 函数。

更新:这是规范的完整代码 sn-p

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();
  }));
});

【问题讨论】:

  • 你的 beforeEach 和 afterEach 是在 describe 块之外定义的这一事实是可疑的......除非你没有在那里显示所有代码?如果您逐字发布整个文件,也许会有所帮助。
  • beforeEach 和 afterEach 钩子在 describe 块内。我已经用规范的结构化 sn-p 更新了问题。

标签: node.js unit-testing mocha.js sinon chai


【解决方案1】:

您的res 对象正在将状态从一个测试带入另一个测试。您应该在 beforeEach 中初始化它,而不是直接在 describe 块中。

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 2023-04-11
    • 2019-02-14
    • 2016-05-26
    • 2023-03-21
    • 2018-11-05
    • 2019-02-03
    • 2021-03-08
    • 2023-03-22
    相关资源
    最近更新 更多