从webdriver.io获取数据后动态构建Mocha测试

时间:2015-11-30 14:35:01

标签: javascript gulp mocha webdriver-io data-driven

我正在寻找一种在异步获取数据后定义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_drivenleche.withData插件启动Mocha测试之前,使用Gulp加载HTML和提取按钮。

您是否直接了解Mocha测试定义中的其他解决方案?

提前致谢,

3 个答案:

答案 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会尝试将功能传递到您的所有itbefore等等。如果您接受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;
    }
}