从 webdriver.io 获取数据后动态构建 Mocha 测试
Posted
技术标签:
【中文标题】从 webdriver.io 获取数据后动态构建 Mocha 测试【英文标题】:Build Mocha test dynamically after getting data from webdriver.io 【发布时间】:2016-03-04 05:36:23 【问题描述】:我正在寻找一种在异步获取数据后定义 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 测试定义中的另一种解决方案吗?
提前致谢,
【问题讨论】:
【参考方案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;
【讨论】:
【参考方案2】:如果您不介意滥用 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');
);
【讨论】:
什么是 promiseFn() 在这种情况下? @WexonipromiseFn()
代表您在动态生成测试之前需要执行的任何基于 Promise 的异步操作。 OP 想要“在异步获取数据后定义 Mocha 测试”,因此在异步数据准备就绪时完成的根级 before
回调中返回一个 javascript 承诺就可以了。否则,您将仅限于同步操作。
恐怕我不明白 :(。我有一个 Main 测试,它调用另一个 Helper 文件,并在其中生成了一些其他测试。主测试运行,如果还有其他测试在帮助文件中生成,它们被返回并返回到 Main,我也需要符文它们。我该如何实现?我在 SO 上提出了一个问题。***.com/questions/42508514/…
参见--delay
标志你正在尝试做的事情,而不是假的-it
hack:github.com/mochajs/mocha/issues/2221#issuecomment-214636042
@Kev 除了作为标志而不是代码的一部分之外,--delay
还强制您在代码中选择一个入口点来调用它们的全局 run()
函数。我的方法是让你任意初始化任何或所有测试文件,并在代码本身中完成。【参考方案3】:
Mocha 支持两种方法来处理测试中的异步性。一种方法是使用 done 回调。 Mocha 将尝试将一个函数传递给您的所有it
s、before
s 等。如果您接受done
回调,则您有责任在异步操作完成时调用它。
回调样式:
before(function(done)
browser.url("url").getHTML("button").then(function()
done();
);
);
另一种方法是使用 Promises。由于您对 getHTML 的调用返回了一个 Promise,因此您只需返回该 Promise,Mocha 就会知道在继续执行任何操作之前等待该 Promise 解决。
这是 Promise 样式的示例:
before(function()
return browser.url("url").getHTML("button");
);
对此有几点值得注意:
- getHtml()
返回对 html 按钮的承诺。每当对getHTML
的异步调用完成时,传递给then
函数的函数就会被调用,并且对getHTML
的调用的结果值会被传入。
- 在之前返回那个承诺让 mocha 知道你正在做一些异步的事情。 Mocha 将等待该承诺达成,然后再超越您的“之前”。
对于您的具体示例,您可能想尝试如下:
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)
);
);
);
【讨论】:
感谢您的完整回答,但我想做的是使用按钮结果创建it
测试。类似的东西:buttons.forEach(function(button) it('does something', function() ); );
以上是关于从 webdriver.io 获取数据后动态构建 Mocha 测试的主要内容,如果未能解决你的问题,请参考以下文章
webdriver.io 无法为 iframe 禁用同源策略
npm 错误!代码 ELIFECYCLE - 从 jenkins 运行 webdriver IO 测试