11

Karma を実行するために Mocha で記述されたテストを取得しようとしていますが、それらはある程度機能しますが、done() メソッドを使用して非同期テストを実装することはできません。これにより、基本的にツールが役に立たなくなります。私は何が欠けていますか?

カルマ.conf.js

module.exports = function(config) {
  config.set({
    basePath: '../..',
    frameworks: ['mocha', 'requirejs', 'qunit'],
    client: {
        mocha: {
            ui: 'bdd'
        }
    },
    files: [
      {pattern: 'libs/**/*.js', included: false},
      {pattern: 'src/**/*.js', included: false},
      {pattern: 'tests/mocha/mocha.js', included: false},
      {pattern: 'tests/should/should.js', included: false},
      {pattern: 'tests/**/*Spec.js', included: false},
      'tests/karma/test-main.js'
    ],
    exclude: [
      'src/main.js'
    ],
    // test results reporter to use
    // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
    reporters: ['progress', 'dots'],
    port: 9876,
    colors: true,
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_WARN,
    autoWatch: true,
    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera (has to be installed with `npm install karma-opera-launcher`)
    // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
    // - PhantomJS
    // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
    browsers: ['Chrome'],
    // If browser does not capture in given timeout [ms], kill it
    captureTimeout: 60000,
    // Continuous Integration mode
    // if true, it capture browsers, run tests and exit
    singleRun: false
  });
};

test-main.js (RequireJS の構成)

var allTestFiles = [];
var pathToModule = function(path) {
  return path.replace(/^\/base\//, '../').replace(/\.js$/, '');
};

Object.keys(window.__karma__.files).forEach(function(file) {
  if (/Spec\.js$/.test(file)) {
    // Normalize paths to RequireJS module names.
    allTestFiles.push(pathToModule(file));
  }
});

require.config({
  // Karma serves files under /base, which is the basePath from your config file
  baseUrl: '/base/src',
  paths: {
    'should': '../tests/should/should',
    'mocha': '../tests/mocha/mocha',
    'pubsub': '../libs/pubsub/pubsub',
    'jquery': '../libs/jquery/jquery-1.10.2',
    'jquery-mobile': '//code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min'
  },
  // dynamically load all test files
  deps: allTestFiles, 
  // we have to kickoff jasmine, as it is asynchronous
  callback: window.__karma__.start
});

テスト/fooSpec.js

define(['music/note'], function(Note) {

describe('nothing', function(done) {
    it('a silly test', function() {
        var note = new Note;
        note.should.not.eql(32);
    });
    done();
});
...

これは不自然な例ですが、done() 呼び出しを削除すると成功します。そのまま、私は得る:

Uncaught TypeError: undefined is not a function
at /Library/WebServer/Documents/vg/tests/mocha/fooSpec.js:8

これが done() 行です。これがどのように/なぜ定義されていないのですか? 他に Mocha を設定する場所 (またはどのオプションを使用するか) がわかりません。RequireJS が Mocha に干渉する原因となる、ある種のグローバル名前空間またはメタプログラミングの魔法はありますか?

関連する場合に備えて、OS X 10.9.2 の Chrome 33 でテストを実行しています。私はこれに多くの時間を費やし、自動テストをあきらめる準備ができています :( -- QUnit/Karma/RequireJS で同様のレンガの壁があり、テストを正常に自動化するための代替手段を見つけることができませんでした。ばか。

4

3 に答える 3

16

Mocha では、doneコールバックはit, before, after,beforeEachですafterEach。そう:

describe('nothing', function() {
    it('a silly test', function(done) {
        var note = new Note;
        note.should.not.eql(32);
        done();
    });
});

これがドキュメントです。

于 2014-03-19T10:49:21.557 に答える
2

この例で実行しているテストでは、done() コールバックは必要ありません。非同期ではありません。done コールバックが必要な場合の例....

describe('Note', function() {
    it('can be retrieved from database', function(done) {
        var note = new Note();
        cb = function(){
           note.contents.should.eql("stuff retrieved from database");
           done()
        }
        //cb is passed into the async function to be called when it's finished
        note.retrieveFromDatabaseAsync(cb)
    });
});

テストに完了コールバックがあってはなりません

describe('nothing', function() {
    it('umm...', function() {
        var note = new Note;
        note.should.not.eql(32);
    });

});

「it」関数のみが完了コールバックを提供します。説明しません。あなたの問題はカルマにあるのではありません。モカ テストが正しく定義されていません。

于 2014-03-21T01:41:41.683 に答える
1

%$#@!

私は百万年の間、これがバーフになるとは思っていませんでした:

describe('nothing', function(done) {
    it('umm...', function() {
        var note = new Note;
        note.should.not.eql(32);
    });
    done(); // throws error that undefined is not a function
});

しかし、これはうまくいきます:

describe('nothing', function(done) {
    it('umm...', function() {
        var note = new Note;
        note.should.not.eql(32);
    });
    setTimeout(function() {
        done();  // MAGIC == EVIL.
    }, 1000);
});
于 2014-03-19T02:33:38.800 に答える