mocha-wrap

Mocha 测试中轻松包装 `describe` 和 `it` 块的流畅可插拔接口
51
作者Jordan Harband

Mocha 测试中轻松包装 `describe`、`context` 和 `it` 块的流畅可插拔接口。

示例

var wrap = require('mocha-wrap');
var expect = require('chai').expect;

var mockWindow = {
    location: {
        href: 'test/url'
    }
};
wrap().withGlobal('window', () => mockWindow).describe('mocked window', function () {
    it('is mocked', function () {
        expect(window).to.equal(mockWindow);
    });

    it('has the right URL', function () {
        expect(window.location.href).to.equal('test/url');
    });
});

var obj = { a: 1 };
wrap().withOverrides(() => obj, () => ({ a: 2, b: 3 })).describe('overridden object keys', function () {
    it('has "b"', function () {
        expect(obj.b).to.equal(3);
    });

    it('has overridden "a"', function () {
        expect(obj.a).to.equal(2);
    });
});

wrap().withOverride(() => obj, 'a', () => 4).skip().describe('this test is skipped', function () {
    it('also supports .only()!', function () {
        expect(true).to.equal(false); // skipped
    });
});

插件

一个 `mocha-wrap` **插件** 是一个命名函数,它返回一个 MochaWrapper 实例或一个描述符对象。

  • 插件函数的 `name` 必须以字符串“with”开头。

  • 插件可以全局注册,也可以使用 `.use` 进行临时使用。

  • `.use` 需要一个插件函数作为其第一个参数;后续参数将传递给插件。

  • `.extend` 需要一个非空的描述字符串和一个描述符对象,该对象可能包含一个函数值或函数数组,其键对应于所有或任何支持的 mocha 方法。

  • 全局注册的插件、`.use` 调用和 `.extend` 调用可以链接、存储和重用 - 链中的每个链接都会创建一个新的 MochaWrapper 实例。

  • 一个描述符对象可以包含以下 5 个键中的任何一个或所有

  • 一个 `description` 字符串,用于“describe”和/或“it”(在返回对象时需要此字符串)

  • beforeEach:一个函数或函数数组,用于 `mocha` 的 `beforeEach` 函数

  • afterEach:一个函数或函数数组,用于 `mocha` 的 `afterEach` 函数

  • before:一个函数或函数数组,用于 `mocha` 的 `before` 函数

  • after:一个函数或函数数组,用于 `mocha` 的 `after` 函数

最常见的方法是插件函数返回 `this.extend(description, descriptor)`。

插件函数必须具有以“with”开头的 `name`,并且将使用 MochaWrapper 实例的接收器(“this”值)调用。

要注册插件,请使用插件函数在 `mocha-wrap` 上调用 `register` 函数。这不应该在可重用的模块中完成。

module.exports = function withFoo(any, args, you, want) {
    return this.extend('with some foo stuff', {
        beforeEach: function () {
            // setup ran before each test
        },
        afterEach: [
            function () {
                // teardown ran after each test
            },
            function () {
                // more teardown
            }
        ],
        before: function () {
            // setup ran once before all tests
        },
        after: function () {
            // teardown ran once after all tests
        }
    });
};

用法

var wrap = require('mocha-wrap');
wrap.register(require('mocha-wrap-with-foo'));

wrap().withFoo().describe…

skip/only

虽然 mocha 有 `describe.skip`、`describe.only`、`context.skip`、`context.only`、`it.skip` 和 `it.only`,但在不使用 ES5 属性访问器的情况下,无法在 mocha-wrap 中实现这些功能。由于此项目支持 ES3,因此我们决定使用 `.skip().describe` 等,而不是放弃拥有 skip/only 的能力。

测试

只需克隆仓库,运行 `npm install`,然后运行 `npm test`