我正在寻找一种在异步获取数据后定义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或leche.withData插件启动Mocha测试之前,使用Gulp加载HTML和提取按钮。
您是否直接了解Mocha测试定义中的其他解决方案?
提前致谢,
答案 0 :(得分:4)
如果您不介意稍微滥用It()
挂钩,您实际上可以使用mocha创建动态before()
测试:
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');
});
答案 1 :(得分:1)
Mocha支持两种方法来处理测试中的异步性。一种方法是使用完成回调。 Mocha会尝试将功能传递到您的所有it
,before
等等。如果您接受done
回调,则您有责任在您的before(function(done) {
browser.url("url").getHTML("button").then(function() {
done();
});
});
回复时调用它异步操作已完成。
回调风格:
before(function() {
return browser.url("url").getHTML("button");
});
另一种方法是使用Promises。由于你对getHTML的调用返回了一个Promise,你可以回复那个承诺,并且Mocha会知道等待承诺结算然后继续前进。
这是Promise风格的一个例子:
getHtml()
有几件值得注意的事情:
- getHTML
返回html按钮的承诺。每当对then
的异步调用完成时,都会调用传递给getHTML
函数的函数,并传入调用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知道你正在做异步的事情。摩卡将等待这个承诺解决,然后再过去你的'。
对于您的具体示例,您可能想尝试这样的事情:
<input type="text" onfocus="myFunction()">
答案 2 :(得分:1)
似乎不可能使用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;
}
}