从 webdriver.io 获取数据后动态构建 Mocha 测试
Build Mocha test dynamically after getting data from webdriver.io
我正在寻找一种在异步获取数据后定义 Mocha 测试的解决方案。
目前,我使用 gulp-webdriver 通过 Selenium 获取 HTML 内容。
我想测试某些 HTML 标签结构。
例如,我想从 HTML 页面获取所有按钮结构。
1° 在 Mocha Before() 中,我得到按钮:
var buttons = browser.url("url").getHTML("button");
2° 之后,我想在单独的 it
中测试每个按钮:
buttons.forEach(function(button) { it() });
找到的唯一解决方案是在使用 data_driven or leche.withData 插件启动 Mocha 测试之前加载 HTML 并使用 Gulp 提取按钮。
你知道直接在 Mocha 测试定义中的另一种解决方案吗?
提前致谢,
Mocha 支持两种方式来处理测试中的异步性。一种方法是使用完成回调。 Mocha 将尝试将一个函数传递给您的所有 it
s、before
s 等。如果您接受 done
回调,则您有责任在异步操作完成时调用它.
回调样式:
before(function(done) {
browser.url("url").getHTML("button").then(function() {
done();
});
});
另一种方法是使用 Promises。由于您对 getHTML return 的调用是一个 Promise,因此您可以 return 该 promise 并且 Mocha 会知道在继续任何事情之前等待 promise 解决。
以下是 Promise 样式的示例:
before(function() {
return browser.url("url").getHTML("button");
});
有几点值得注意:
- getHtml()
return 是对 html 按钮的承诺。每当对 getHTML
的异步调用完成时,就会调用传递给 then
函数的函数,并传入调用 getHTML
的结果值。
- 在 before 中返回那个 promise 让 mocha 知道你正在做一些异步的事情。 Mocha 将等待该承诺兑现,然后再通过您的 'before'.
对于您的具体示例,您可能想尝试这样的事情:
describe('the buttons', function() {
var buttons;
before(function() {
return browser.url("url").getHTML("button").then(function(result) {
buttons = result;
};
});
it('does something', function() {
buttons.forEach(function(button) {
});
});
});
似乎无法使用 mocha 动态创建 it() 测试。
我终于这样组织了我的测试:
it('Check if all tag have attribute', function() {
var errors = [];
elements.forEach(function(element, index, array) {
var $ = cheerio.load(element);
var tag = $(tagName);
if (tag.length) {
if (!tag.attr(tagAttr)) errors.push(element);
}
});
expect(errors).to.be.empty;
}
}
如果您不介意稍微滥用 before()
钩子,您实际上可以使用 mocha 创建动态 It()
测试:
before(function () {
console.log('Let the abuse begin...');
return promiseFn().
then(function (testSuite) {
describe('here are some dynamic It() tests', function () {
testSuite.specs.forEach(function (spec) {
it(spec.description, function () {
var actualResult = runMyTest(spec);
assert.equal(actualResult, spec.expectedResult);
});
});
});
});
});
it('This is a required placeholder to allow before() to work', function () {
console.log('Mocha should not require this hack IMHO');
});
我正在寻找一种在异步获取数据后定义 Mocha 测试的解决方案。
目前,我使用 gulp-webdriver 通过 Selenium 获取 HTML 内容。 我想测试某些 HTML 标签结构。
例如,我想从 HTML 页面获取所有按钮结构。
1° 在 Mocha Before() 中,我得到按钮:
var buttons = browser.url("url").getHTML("button");
2° 之后,我想在单独的 it
中测试每个按钮:
buttons.forEach(function(button) { it() });
找到的唯一解决方案是在使用 data_driven or leche.withData 插件启动 Mocha 测试之前加载 HTML 并使用 Gulp 提取按钮。
你知道直接在 Mocha 测试定义中的另一种解决方案吗?
提前致谢,
Mocha 支持两种方式来处理测试中的异步性。一种方法是使用完成回调。 Mocha 将尝试将一个函数传递给您的所有 it
s、before
s 等。如果您接受 done
回调,则您有责任在异步操作完成时调用它.
回调样式:
before(function(done) {
browser.url("url").getHTML("button").then(function() {
done();
});
});
另一种方法是使用 Promises。由于您对 getHTML return 的调用是一个 Promise,因此您可以 return 该 promise 并且 Mocha 会知道在继续任何事情之前等待 promise 解决。
以下是 Promise 样式的示例:
before(function() {
return browser.url("url").getHTML("button");
});
有几点值得注意:
- getHtml()
return 是对 html 按钮的承诺。每当对 getHTML
的异步调用完成时,就会调用传递给 then
函数的函数,并传入调用 getHTML
的结果值。
- 在 before 中返回那个 promise 让 mocha 知道你正在做一些异步的事情。 Mocha 将等待该承诺兑现,然后再通过您的 'before'.
对于您的具体示例,您可能想尝试这样的事情:
describe('the buttons', function() {
var buttons;
before(function() {
return browser.url("url").getHTML("button").then(function(result) {
buttons = result;
};
});
it('does something', function() {
buttons.forEach(function(button) {
});
});
});
似乎无法使用 mocha 动态创建 it() 测试。
我终于这样组织了我的测试:
it('Check if all tag have attribute', function() {
var errors = [];
elements.forEach(function(element, index, array) {
var $ = cheerio.load(element);
var tag = $(tagName);
if (tag.length) {
if (!tag.attr(tagAttr)) errors.push(element);
}
});
expect(errors).to.be.empty;
}
}
如果您不介意稍微滥用 before()
钩子,您实际上可以使用 mocha 创建动态 It()
测试:
before(function () {
console.log('Let the abuse begin...');
return promiseFn().
then(function (testSuite) {
describe('here are some dynamic It() tests', function () {
testSuite.specs.forEach(function (spec) {
it(spec.description, function () {
var actualResult = runMyTest(spec);
assert.equal(actualResult, spec.expectedResult);
});
});
});
});
});
it('This is a required placeholder to allow before() to work', function () {
console.log('Mocha should not require this hack IMHO');
});