蓝鸟摩卡中的每个循环都不起作用
Bluebird Each loop in Mocha not working
我正在编写一个测试,我需要循环遍历异步 api 调用的结果并动态生成 mocha 'Its' 以测试响应的每次迭代。我找到了一些其他相关的答案,这让我开始了。到目前为止,这是我尝试过的。
function getter(uri) {
return new Promise(function(resolve, reject) {
request({
method: 'GET',
json: true,
uri: uri
}, function(error, response, body) {
if (response.statusCode == 200) {
resolve(body);
} else {
reject(error);
}
});
});
}
describe('This works', function() {
it('works', function(done) {
getter('myapi_that_returns_an_array').then(function(r) {
r.should.not.be.empty;
done();
}).catch(function(err) {
done(err);
});
});
});
describe('Why not this one', function() {
getter('myapi_that_returns_an_array').each(function(r) {
it('should make a test', function(done) {
r.should.not.be.empty;
done();
});
});
});
我尝试将一个简单的数组包装在一个 promise 中并将其提供给我的测试并且它有效!所以我无法弄清楚为什么我进行的 api 调用不以同样的方式工作。
function simple_test() {
return new Promise(function (resolve, reject) {
resolve([ [1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 2, 1], [4, 1, 2, 3] ]);
});
}
describe('But this one works', function() {
two().each(function(r) {
it('is a test', function(done) {
r.should.not.be.empty();
done();
});
});
});
我尝试向 simple_test 添加超时,使其像 api 调用一样运行 - 结果与 api 调用相同。有没有办法用摩卡做到这一点?看起来 describe 在等待 promise 解决之前正在执行。
我认为问题是您必须同步定义测试,尽管每个单独的测试可能异步完成。您可以从静态数据动态定义 it()
块,因为这些测试是在 describe()
调用 returns.
之前定义的
我不完全理解为什么测试在很少或没有超时间隔的情况下异步工作,但我的实验表明 it()
必须在 describe()
returns 之前至少调用一次用于在输出中识别的测试。超时 1 毫秒,我看到了父块中描述的测试。
使用before()
块遇到同样的问题。 before()
可以等待承诺的数组解析,但如果没有任何 it()
静态定义的测试,before()
将永远不会得到 运行.
简单但不受欢迎的替代方法是让单个 it()
块测试您的服务返回的所有数据。另一种方法是使用您的 Web 服务的结果首先动态生成一个 mocha 测试文件,然后 运行 mocha 反对它。
var assert = require("assert");
var Promise = require("bluebird");
var testData = [
{ "name": "Test 1", "value": true },
{ "name": "Test 2", "value": false },
{ "name": "Test 3", "value": true }
];
function getTestData(timeout) {
return new Promise(function (resolve, reject) {
if (timeout) {
setTimeout(function () {
resolve(testData);
}, timeout);
} else {
resolve(testData);
}
});
}
describe("Dynamicly Generating Tests", function() {
describe("A: Promised Array, no timeout - Works", function () {
getTestData().each(function (test) {
it("A: " + test.name, function () {
assert.ok(test.value);
});
});
});
describe("B: Promised Array, short timeout - Works?", function () {
getTestData(1).then(function (testData) {
testData.forEach(function (test) {
it("B:" + test.name, function () {
assert.ok(test.value);
});
});
});
});
describe("C: Promised Array, timeout, single it() - Works!", function () {
it("C: Has all correct values", function () {
return getTestData(1000).each(function (test) {
assert.ok(test.value, test.name);
});
})
});
});
您尝试通过在 getter.each
中调用 it
来生成测试的测试版本无法工作,因为 Mocha 没有规定异步生成测试是你正在尝试做的。正如我所解释的 here:
What you get has to do with how Mocha discovers your test. Basically Mocha does this:
Read all your test files and execute them. The callbacks passed to describe
are executed right away. The callbacks passed to it
and to the hooks (before, beforeEach
, etc.) are recorded for later execution.
Mocha executes what it has recorded for later execution (according to some sensible order which is not important here).
尝试异步生成测试的问题在于,当异步代码执行时,您已经超出了 describe
块,测试将被忽略。在考虑 describe
块结束之前,无法告诉 Mocha 等待异步操作。
我正在编写一个测试,我需要循环遍历异步 api 调用的结果并动态生成 mocha 'Its' 以测试响应的每次迭代。我找到了一些其他相关的答案,这让我开始了。到目前为止,这是我尝试过的。
function getter(uri) {
return new Promise(function(resolve, reject) {
request({
method: 'GET',
json: true,
uri: uri
}, function(error, response, body) {
if (response.statusCode == 200) {
resolve(body);
} else {
reject(error);
}
});
});
}
describe('This works', function() {
it('works', function(done) {
getter('myapi_that_returns_an_array').then(function(r) {
r.should.not.be.empty;
done();
}).catch(function(err) {
done(err);
});
});
});
describe('Why not this one', function() {
getter('myapi_that_returns_an_array').each(function(r) {
it('should make a test', function(done) {
r.should.not.be.empty;
done();
});
});
});
我尝试将一个简单的数组包装在一个 promise 中并将其提供给我的测试并且它有效!所以我无法弄清楚为什么我进行的 api 调用不以同样的方式工作。
function simple_test() {
return new Promise(function (resolve, reject) {
resolve([ [1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 2, 1], [4, 1, 2, 3] ]);
});
}
describe('But this one works', function() {
two().each(function(r) {
it('is a test', function(done) {
r.should.not.be.empty();
done();
});
});
});
我尝试向 simple_test 添加超时,使其像 api 调用一样运行 - 结果与 api 调用相同。有没有办法用摩卡做到这一点?看起来 describe 在等待 promise 解决之前正在执行。
我认为问题是您必须同步定义测试,尽管每个单独的测试可能异步完成。您可以从静态数据动态定义 it()
块,因为这些测试是在 describe()
调用 returns.
我不完全理解为什么测试在很少或没有超时间隔的情况下异步工作,但我的实验表明 it()
必须在 describe()
returns 之前至少调用一次用于在输出中识别的测试。超时 1 毫秒,我看到了父块中描述的测试。
使用before()
块遇到同样的问题。 before()
可以等待承诺的数组解析,但如果没有任何 it()
静态定义的测试,before()
将永远不会得到 运行.
简单但不受欢迎的替代方法是让单个 it()
块测试您的服务返回的所有数据。另一种方法是使用您的 Web 服务的结果首先动态生成一个 mocha 测试文件,然后 运行 mocha 反对它。
var assert = require("assert");
var Promise = require("bluebird");
var testData = [
{ "name": "Test 1", "value": true },
{ "name": "Test 2", "value": false },
{ "name": "Test 3", "value": true }
];
function getTestData(timeout) {
return new Promise(function (resolve, reject) {
if (timeout) {
setTimeout(function () {
resolve(testData);
}, timeout);
} else {
resolve(testData);
}
});
}
describe("Dynamicly Generating Tests", function() {
describe("A: Promised Array, no timeout - Works", function () {
getTestData().each(function (test) {
it("A: " + test.name, function () {
assert.ok(test.value);
});
});
});
describe("B: Promised Array, short timeout - Works?", function () {
getTestData(1).then(function (testData) {
testData.forEach(function (test) {
it("B:" + test.name, function () {
assert.ok(test.value);
});
});
});
});
describe("C: Promised Array, timeout, single it() - Works!", function () {
it("C: Has all correct values", function () {
return getTestData(1000).each(function (test) {
assert.ok(test.value, test.name);
});
})
});
});
您尝试通过在 getter.each
中调用 it
来生成测试的测试版本无法工作,因为 Mocha 没有规定异步生成测试是你正在尝试做的。正如我所解释的 here:
What you get has to do with how Mocha discovers your test. Basically Mocha does this:
Read all your test files and execute them. The callbacks passed to
describe
are executed right away. The callbacks passed toit
and to the hooks (before, beforeEach
, etc.) are recorded for later execution.Mocha executes what it has recorded for later execution (according to some sensible order which is not important here).
尝试异步生成测试的问题在于,当异步代码执行时,您已经超出了 describe
块,测试将被忽略。在考虑 describe
块结束之前,无法告诉 Mocha 等待异步操作。