从 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 将尝试将一个函数传递给您的所有 its、befores 等。如果您接受 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');
});