MochaJS:如何在测试之间共享断言/"it('should')" 代码
MochaJS: How to share assertion/"it('should')" code between tests
我有一些 mocha 测试 运行 使用 Nodejs 来测试网络服务器。
许多测试会导致服务器 return 出错,例如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,所以我可能遗漏了一些明显的东西。
此外,解释 为什么函数方法不起作用?
加分
谢谢!
wiki 上有一篇关于此的文章。
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();
});
我猜你的代码看起来像这样:
describe('When passing bad JSON data', function(){
var response
before(function(done){
callUrlToInsert(url, badJson, function(err, resp){
response = resp
done()
}
}
verifyItReturnedBadRequest400(httpResponse)
}
这样想:
it()
创建一个测试。
- 所有对
it
的调用发生在 之前 任何测试实际上是 运行 (您必须在 运行 它们之前创建测试)
- 传递给 `before' 的函数是在创建测试之后 运行,但是 before 它们是 运行.
verifyItReturnedBadRequest400
调用 it
来创建一个测试,但是你在任何测试 运行 之前传递了 httpResponse,所以 before
还没有运行 还是。
您可以继续使用那种模式,但您需要将 httpresponse 放入容器中以便传递对它的引用:
describe('When passing bad JSON data', function(){
var data = {};
before(function(done){
callUrlToInsert(url, badJson, function(err, resp){
data.response = resp
done()
}
}
verifyItReturnedBadRequest400(data)
}
然后你的 verifyItReturnedBadRequest400
变成:
function verifyItReturnedBadRequest400(data) {
it('should respond with 400 (Bad Request)', function (){
expect(data.response.statusCode).to.equal(httpstatus.BAD_REQUEST);
});
}
我有一些 mocha 测试 运行 使用 Nodejs 来测试网络服务器。
许多测试会导致服务器 return 出错,例如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,所以我可能遗漏了一些明显的东西。
此外,解释 为什么函数方法不起作用?
加分谢谢!
wiki 上有一篇关于此的文章。 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();
});
我猜你的代码看起来像这样:
describe('When passing bad JSON data', function(){
var response
before(function(done){
callUrlToInsert(url, badJson, function(err, resp){
response = resp
done()
}
}
verifyItReturnedBadRequest400(httpResponse)
}
这样想:
it()
创建一个测试。- 所有对
it
的调用发生在 之前 任何测试实际上是 运行 (您必须在 运行 它们之前创建测试) - 传递给 `before' 的函数是在创建测试之后 运行,但是 before 它们是 运行.
verifyItReturnedBadRequest400
调用it
来创建一个测试,但是你在任何测试 运行 之前传递了 httpResponse,所以before
还没有运行 还是。
您可以继续使用那种模式,但您需要将 httpresponse 放入容器中以便传递对它的引用:
describe('When passing bad JSON data', function(){
var data = {};
before(function(done){
callUrlToInsert(url, badJson, function(err, resp){
data.response = resp
done()
}
}
verifyItReturnedBadRequest400(data)
}
然后你的 verifyItReturnedBadRequest400
变成:
function verifyItReturnedBadRequest400(data) {
it('should respond with 400 (Bad Request)', function (){
expect(data.response.statusCode).to.equal(httpstatus.BAD_REQUEST);
});
}