在javascript中,如何将对象的所有属性复制到块的变量范围中?

时间:2018-06-15 18:43:33

标签: javascript scope

有没有办法以自动方式在javascript中添加函数或块的变量范围?如果是这样,怎么样?

例如,假设我有一些像这样的单元测试代码:

describe('something something', function () {
    // tested module
    let myTestedModule;

    before(function () {
        myTestedModule = rewire('../../path/to/my-tested-module');
    });

    // tested module dependencies
    let someRandomLib;
    let myDBAdapter;
    let util;
    let common;

    const restoreFunctions = [];

    beforeEach(function () {
        restoreFunctions.push(myTestedModule.__set__('someRandomLib', new Mock()));
        restoreFunctions.push(myTestedModule.__set__('myDBAdapter', new Mock()));
        restoreFunctions.push(myTestedModule.__set__('util', new Mock()));
        restoreFunctions.push(myTestedModule.__set__('common', new Mock()));
    });

    afterEach(function () {
        lodash.forEach(restoreFunctions, function (restore) {
            restore();
        });
    });

    // tests
    it('should do some amazing things', function (done) {
        // tested call
        myTestedModule.doStuff('foo', 'bar');

        // assertions
        someRandomLib.asdf.should.be.calledWithExactly('foo');

        // done
        done();
    });
});

大多数实际代码会在多个测试中重复出现,将它简化为类似的东西是微不足道的:

describe('something something', function () {
    const testEnv = new TestEnvironment({
        module: 'myTestedModule',
        path: '../../path/to/my-tested-module',
        dependencies: ['someRandomLib', 'myDBAdapter', 'util', 'common'],
    });

    it('should do some amazing things', function (done) {
        // tested call
        testEnv.myTestedModule.doStuff('foo', 'bar');

        // assertions
        testEnv.someRandomLib.asdf.should.be.calledWithExactly('foo');

        // done
        done();
    });
});

但是,如果我可以省略大多数testEnv索引,那么在可读性方面测试会更好。它只是管道,而不是实际测试的一部分。

所以,为了获得两全其美,我真正想写的是这样的:

describe('something something', function () {
    setupTestEnvironment({
        module: 'myTestedModule',
        path: '../../path/to/my-tested-module',
        dependencies: ['someRandomLib', 'myDBAdapter', 'util', 'common'],
    });

    it('should do some amazing things', function (done) {
        // tested call
        myTestedModule.doStuff('foo', 'bar');

        // assertions
        someRandomLib.asdf.should.be.calledWithExactly('foo');

        // done
        done();
    });
});

为此,我需要一种方法将对象自己的属性导入变量范围(即此函数的变量范围)。

在Python中,您可以使用装饰器实现此目的。在Lua中,您可以使用_Msetfenv执行此操作。在Javascript中可以吗?

1 个答案:

答案 0 :(得分:-1)

我认为这对destructuring来说是个好例子。

it('should do some amazing things', function (done) {
    const {myTestedModule, someRandomLib} = testEnv;

    // tested call
    myTestedModule.doStuff('foo', 'bar');

    // assertions
    someRandomLib.asdf.should.be.calledWithExactly('foo');

    // done
    done();
});