2013-12-09 125 views
12

我很難將摩卡連接到基於RequireJS的應用程序,可能你會想出一些東西:)。幾個小時後,我一直試圖加載AMD模塊,並簡單地console.log一些'已解除'的信息,該模塊已經加載......沒有發生任何事情發生 - 程序剛結束並打印出一些摩卡信息。摩卡+ RequireJS = AMD測試

var facade = requirejs(['../../public/js/scripts/widgets/widgets/article/main.js'],  
    function(mod) { 
     console.log('fired') 
}); 
// run with: $ mocha -u tdd test.js --reporter spec 

,比我想出的主意火眼前這個測試回調:

setTimeout((function() { 
    console.log('fired'); 
}), 5000); 
// run with: $ mocha -u tdd test.js --reporter spec 

也沒有工作。所以最後我跑了

$ node test.js 

最後它的工作。所以問題是:如何使用回調處理來運行Mocha測試,因爲這些對於AMD測試是必不可少的?

回答

23

你這樣做的方式,摩卡不會對你的文件做任何事情,因爲它不會在其中看到測試套件。 RequireJS計劃召喚回調,但摩卡會在有機會發生之前退出。與您的超時示例相同。

下面給出一個例子。

文件test.js

'use strict'; 
var requirejs = require("requirejs"); 
requirejs.config({ 
    baseUrl: '.', 
    nodeRequire: require 
}); 

suite('Something', function(){ 
    var foo; 

    suiteSetup(function (done){ 
     // This saves the module foo for use in tests. You have to use 
     // the done callback because this is asynchronous. 
     requirejs(['foo'], 
        function(mod) { 
      console.log("fired!"); 
      foo = mod; 
      done(); 
     }); 
    }); 

    suite('blah', function(){ 
    test('blah', function(){ 
     if (foo.test !== "test") 
      throw new Error("failed!"); 
    }); 
    }); 
}); 

文件foo.js

define(function() { 
    return {test: "test"}; 
}); 

當你運行:

mocha -u tdd test.js 

你會看到,回調被觸發,測試通過。

爲了讀者閱讀這個問題的好處,並使用suite,suiteSetup,test ...... Mocha支持多接口。此處的代碼使用TDD接口(OP調用Mocha的-u tdd),其導出suite,suiteSetup,test等。在默認BDD接口中,等效值分別爲describe,beforeit

+1

是的!我想這'done()'方法是失蹤的難題:)。 –

+0

不只是「完成」,請參閱我添加到答案開頭的段落。摩卡沒有在文件中看到測試套件並立即退出。 – Louis

+0

是的,當然,烏爾權利。 –

3

我在RequireJS的環境中配置了使用摩卡的相關樣板。這可能不是你想要的,但它可能會有所幫助。 https://github.com/x2es/boilerplate-karma-mocha-chai-requirejs

還有一點需要注意 - 假設你的腳本放置在「/ public」中,在瀏覽器環境而不是nodejs中測試它是有意義的。爲此,你應該看看像JsTestDriver(https://code.google.com/p/js-test-driver/)或karma-runner(http://karma-runner.github.io/)這樣的測試運行者。或其他...

噶文檔中剪斷提供(http://karma-runner.github.io/0.8/plus/RequireJS.html

var tests = []; 
for (var file in window.__karma__.files) { 
    if (window.__karma__.files.hasOwnProperty(file)) { 
    if (/Spec\.js$/.test(file)) { 
     tests.push(file); 
    } 
    } 
} 

requirejs.config({ 
    // Karma serves files from '/base' 
    baseUrl: '/base/src', 

    paths: { 
     'jquery': '../lib/jquery', 
     'underscore': '../lib/underscore', 
    }, 

    shim: { 
     'underscore': { 
      exports: '_' 
     } 
    }, 

    // ask Require.js to load these files (all our tests) 
    deps: tests, 

    // start test run, once Require.js is done 
    callback: window.__karma__.start 
}); 
當我們強迫requirejs使用

require.config({ 
    deps: ['array', 'of', 'our', 'spec', 'files'] 
}) 

在這種環境中的每個規格文件應該提前下載所有必要的技術規範的文件

介紹方式一個常規的RequireJS模塊。對於這樣的環境測試規範的

例子:

define(['chai'], function(chai) { 
    var expect = chai.expect; 

    describe('bootstrap', function() { 
    it('should...', function() { 
     expect('a').to.equal('a'); 
    }); 
    }); 
}); 
+0

我認爲這個解決方案也可以,但是它使用'chai',我現在想要在沒有'promise'的情況下處理它。但是,謝謝你的努力:)。 –