4

我正在寻找一种在异步获取数据后定义 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 测试定义中的另一种解决方案?

提前致谢,

4

3 回答 3

3

It()如果您不介意滥用before()钩子,您实际上可以使用 mocha 创建动态测试:

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');
});
于 2016-03-03T23:55:10.093 回答
3

似乎不可能用 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;
    }
}
于 2015-12-07T14:33:36.790 回答
1

Mocha 支持两种方法来处理测试中的异步性。一种方法是使用 done 回调。Mocha 将尝试将一个函数传递给您的所有its、befores 等。如果您接受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 知道您正在执行异步操作。摩卡咖啡会等待这个承诺在经过你的“之前”之前得到解决。

对于您的具体示例,您可能想尝试这样的事情:

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) {  
     }); 
   }); 

});
于 2015-11-30T16:07:41.760 回答