мокко как библиотека - PullRequest
7 голосов
/ 14 марта 2012

Я бы хотел использовать mocha (тестовый фреймворк node.js, а не библиотеку ruby ​​mocking) в качестве библиотеки, вместо того, чтобы использовать исполняемый файл mocha для запуска моего теста.

Можно ли запустить тест мокко таким образом? Все примеры просто вызывают библиотеки mocha, предполагая, что они уже «требуются», а исполняемый файл mocha заблаговременно выполняет все «требования», но я действительно предпочел бы сделать это явно в моем сценарии, чтобы я мог просто установите + x в моем скрипте и вызовите его напрямую.

Могу ли я сделать что-то подобное?

#!/usr/bin/env coffee
mocha = require 'mocha'
test = mocha.Test
suite = mocha.Suite
assert = require("chai").assert

thing = null

suite "Logging", () ->
  setup (done) ->
    thing = new Thing()
    done()
  test "the thing does a thing.", (done) ->
    thing.doThing () ->
      assert.equal thing.numThingsDone, 1
      done()
  teardown (done) ->
    thing = null
    done()

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Это возможно, но, безусловно, не рекомендуется.

Посмотрите на источник бинарного файла mocha (в частности, bin/_mocha), чтобы понять, что он делает.В частности, посмотрите на run функцию .Все, что он использует - Runner, Reporter и т. Д. - экспортируется библиотекой mocha, так что ничто не мешает вам сделать это заново.

2 голосов
/ 12 января 2015

Эта функция была добавлена.Ниже приведен пример.

Я получил информацию от здесь:

Вам потребуется 2 файла.Один тест и один для запуска теста.Вы можете пометить runTest как исполняемый файл и установить его вывод в параметрах mocha.

runTest.js

#!/usr/bin/env node

var Mocha = require('mocha'),
    fs    = require('fs'),
    path  = require('path');

var mocha = new Mocha(
{
  ui: 'tdd'     
});

mocha.addFile(
  path.join(__dirname, 'test.js')
);

mocha.run(function(failures){
  process.on('exit', function () {
    process.exit(failures);
  });
});

test.js

var assert = require('chai').assert

suite('Array', function(){
  setup(function(){});
  suite('#indexOf()', function(){
    test('should return -1 when not present', function(){
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});
0 голосов
/ 10 января 2015

Следующий фрагмент позволяет программно управлять основными функциями Mocha вне Node, такими как добавление наборов и запуск наборов на разных этапах.Критическим моментом было выяснение того, как сделать интерфейсы mocha глобально доступными (код также доступен как gist )

var Mocha = require("mocha");
var mocha = new Mocha();
var _suites = [];
var _done = false;

/**
 * default mocha options
 * for other configurations, check out bin/_mocha
 */
mocha.reporter("nyan");
mocha.useColors(true);
mocha.growl();

module.exports = {
    /**
     * set interface (bdd is default) and make it global to node
     * @param  {string} interface bdd|tdd|exports|qunit
     */
    init: function(interface) {
        interface && mocha.ui(interface);
        mocha.suite.emit('pre-require', global, undefined, mocha);
    },
    /**
     * add suite
     * @param {function} suite to be executed later
     */
    add: function(suite) {
        mocha.suite && _suites.push(suite) && suite();
    },
    /**
     * run added suites
     */
    run: function(cb) {
        console.info('run mocha');

        var done = function () {
            _done = true;
            cb && cb();
            process.on('exit', function() {
                console.info("exit mocha");
                process.exit(1);
            });
        };

        mocha.run(done);
    },
    /**
     * end mocha test
     */
    exit: function() {
        if (_done) {
            process.exit();
        } else {
            var start = new Date().getTime(),
            interval = setInterval(function() {
                if (_done) {
                    console.log("test suites finished");
                    clearInterval(interval);
                    process.exit();
                } else if (new Date().getTime() - start > 5000) {
                    console.log("wait for nothing!");
                    clearInterval(interval);
                    process.exit();
                }
            }, 250);
        }
    },
    /**
     * change mocha options at runtime, e.g., "reporter", "nyan"
     */
    _set: function(key, val){
        mocha[property](val);
    }
};
...