2013-12-09 3 views
12

У меня есть трудное время, чтобы подключиться к Mocha to RequireJS на основе приложения, возможно, вы сможете что-то придумать :). После многих часов, когда я пытался загрузить модули AMD и просто console.log, некоторые «уволенные» данные о том, что модуль загружен ... ничего не случилось - программа только что закончилась и распечатала некоторую информацию о мокке.Mocha + 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

Как вы это делаете, мокка ничего не собирается делать с вашим файлом, потому что он не видит набор тестов. Требовать JS планируется вызвать обратный вызов, но mocha выйдет, прежде чем это может произойти. То же самое с вашим примером таймаута.

Ниже приведен пример.

Файл 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 (ОП вызывает мокко с -u tdd), который экспортирует suite, suiteSetup, test и т.д. В интерфейсе BDD по умолчанию эквиваленты являются describe, before и it соответственно.

+1

Да! Я предполагаю, что этот метод «done()» был отсутствующим головоломкой :). –

+0

Не просто '' done'', см. Параграф, который я добавил в начале ответа. Мокка не видел тестового набора в файле и сразу же вышел. – Louis

+0

Да, конечно, Ур. –

3

Я сконфигурировал соответствующий шаблон для использования мокко в среде RequireJS. Это может быть не совсем то, что вы хотите, но это может быть полезно. https://github.com/x2es/boilerplate-karma-mocha-chai-requirejs

Еще одно примечание - если ваш сценарий размещен в «/ public», имеет смысл протестировать его в среде браузера вместо nodejs. Для этого вам нужно посмотреть на какого-нибудь тестировщика, такого как JsTestDriver (https://code.google.com/p/js-test-driver/) или карма-бегуна (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'] 
}) 

В этой среде каждый Spec-файл должен быть регулярный модуль RequireJS.

Пример тестовой спецификации для такой среды:

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

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

Я думаю, что это решение тоже нормально, но оно использует «chai», и я хочу обработать его без «обещаний» пока. Но спасибо за усилия :). –

Смежные вопросы