2014-09-24 100 views
2

我想在摩卡書寫一些測試,我要通過BrowserStack在幾個瀏覽器中自動化。像這樣(實際的測試細節不重要),我不想重複每個瀏覽器的test.it代碼,而是想讓我的代碼保持乾爽,並將幾個test.it塊封裝在一個函數中,然後在test.describe內調用該函數。我如何重複使用摩卡測試,所以我不必重複自己?

function runTests(driver) { 
    test.it('form works', function() { 
    var result = testForm(driver, '#formId', '[email protected]'); 
    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(); }); 
}); 

但由於這個代碼是異步,driverrunTests()被稱爲是沒有定義,所以它失敗。我如何構造這個結構,以便我不必爲每個瀏覽器重複test.it塊?

回答

0

摩卡還使用注入「完成」回調異步測試的概念。因此,如果您在「beforeEach」,「it」和「afterEach」中指定此回調,則Mocha將注入該回調並在執行此回調之前不執行下一個方法。所以我會這樣改變你的代碼:

function runTests(driver, done) { 
    test.it('form works', function(done) { 
    var result = testForm(driver, '#formId', '[email protected]'); 
    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(); 
    }); 
}); 

你可以找到更多關於asynchronous testing with mocha here的信息。

0

我想構建這樣的:

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', '[email protected]'); 
      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,等等。我想你的測試環境包摩卡來電或您正在使用的界面我不熟悉。