【发布时间】:2016-01-10 06:24:09
【问题描述】:
我使用 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 变量已超出范围。 (我不明白为什么会这样,因为在这两种情况下都会调用它();为什么在一种情况下它在另一个级别的函数调用中很重要?我可能遗漏了一些关于Javascript 范围。)
是否有避免所有这些重复代码的通用方法?还是每个人都在到处复制他们所有的断言代码?这是我第一次尝试 Mocha,所以我可能遗漏了一些明显的东西。
另外,解释为什么函数方法不起作用?
谢谢!
【问题讨论】:
-
摩卡中有一种叫做钩子的东西。哪个将块之前,之后,之前和之后。但我不确定这些钩子是否能够运行测试。
-
我的印象是 hooks 是用来 setup 和 teardown 的,但是检查结果必须在实际测试中完成。但我可能是错的。将它('应该')放在“之后”钩子中是否有意义?
-
是的,你是对的。钩子主要用于设置,但到目前为止,只有当钩子支持运行测试时,我才看到任何其他选项。我建议试一试。
标签: node.js unit-testing mocha.js