我使用 Nodejs 运行了一些 Mocha 测试来测试 Web 服务器。
许多测试都会导致服务器返回错误,例如400 错误请求。
目前测试中充斥着以下代码的许多副本:
it('should respond with 400 (Bad Request)', function (){
expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST);
});
这是一个简化的伪代码示例:
describe('When passing bad JSON data', function(){
var response
before(function(done){
callUrlToInsert(url, badJson, function(err, resp){
response = resp
done()
}
}
it('should respond with 400 (Bad Request)', function (){
expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST)
})
}
这让我很烦恼,因为作为一名程序员,我尽可能避免重复代码。
但是,将其放入函数中不起作用:
function verifyItReturnedBadRequest400(httpResponse)
{
it('should respond with 400 (Bad Request)', function (){
expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST);
});
}
因为对 it()
的调用不会立即测试断言;我的[有限]理解是 it()
将闭包添加到测试列表中。因此,当检查完成时,httpResponse
变量已超出范围。 (我不明白为什么会出现这种情况,因为在这两种情况下都有对 it() 的调用;为什么在一种情况下它位于另一级别的函数调用中很重要?我可能遗漏了一些关于JavaScript 范围。)
是否有一种通用方法可以避免所有这些重复代码?还是每个人都在各处复制所有断言代码?这是我第一次涉足 Mocha,所以我可能遗漏了一些明显的东西。
此外,解释为什么函数方法不起作用?的奖励积分
谢谢!
维基百科上有一篇关于此的文章。 https://github.com/mochajs/mocha/wiki/Shared-Behaviours
我猜你的测试中有一些错误。将 it()
放入包装函数中效果很好。这是一个小型的工作演示。
'use strict';
const assert = require('assert');
const xEqualsOne = () => {
it('should be equal 1', () => {
assert.equal(this.x, 1);
});
};
describe('async number', () => {
this.x = 0;
before(done => {
this.x++
setTimeout(done, 100);
});
xEqualsOne();
});
我是一名优秀的程序员,十分优秀!