有没有办法以自动方式在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中,您可以使用_M
或setfenv
执行此操作。在Javascript中可以吗?
答案 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();
});