【发布时间】: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