我怎样才能重复使用摩卡testing,所以我不必重复自己?

我试图在摩卡书写一些testing,我将通过BrowserStack在几个浏览器中自动化。 而不是重复每个浏览器的test.it代码,我想保持我的代码DRY并包装几个test.it块在一个函数中,只是调用test.describe内的test.describe ,像这样(实际的testing细节是不重要的);

 function runTests(driver) { test.it('form works', function() { var result = testForm(driver, '#formId', 'test@test.com'); return 'Expected Result' === result; }); } test.describe('Tests for IE 9', function() { var driver; test.before(function() { var capabilities = { 'browser' : 'IE', 'browser_version' : '9.0' }; driver = setupDriver(capabilities); }); runTests(driver); test.after(function() { driver.quit(); }); }); test.describe('Tests for IE 10', function() { var driver; test.before(function() { var capabilities = { 'browser' : 'IE', 'browser_version' : '10.0' }; driver = setupDriver(capabilities); }); runTests(driver); test.after(function() { driver.quit(); }); }); 

但是由于这个代码是asynchronous的,因此在调用runTests()runTests() driver ,因此失败。 我怎样才能构造这个,以便我不必为每个浏览器重复test.it块呢?

摩卡还使用“完成”callback注入asynchronoustesting的概念。 因此,如果您在“beforeEach”,“it”和“afterEach”中指定此callback,则Mocha将注入该callback,直到调用callback才执行下一个方法。 所以我会这样改变你的代码:

 function runTests(driver, done) { test.it('form works', function(done) { var result = testForm(driver, '#formId', 'test@test.com'); return 'Expected Result' === result; done(); }); } test.describe('Tests for IE 9', function() { var driver; test.before(function(done) { var capabilities = { 'browser' : 'IE', 'browser_version' : '9.0' }; driver = setupDriver(capabilities); done(); }); runTests(driver, done); test.after(function(done) { driver.quit(); done(); }); }); 

你可以在这里find更多关于摩卡asynchronoustesting的信息。

我会这样构造它:

 function makeTests(kind, version) { describe("Tests for " + kind + " " + version, function () { var driver; before(function() { var capabilities = { 'browser' : kind, 'browser_version' : version }; driver = setupDriver(capabilities); }); it('form works', function() { var result = testForm(driver, '#formId', 'test@test.com'); if ('Expected Result' !== result) throw new Error("failed!"); }); // Add more tests here... after(function() { driver.quit(); }); }); } makeTests('IE', '9'); makeTests('IE', '10'); 

我已经在上面的代码中直接使用了describeit ,而不是test.describe等。我想你的testing环境包装了Mocha调用,或者你正在使用我不熟悉的接口。