[英]Unit Testing ES6 Class with External Dependency
我正在尝试为我的公司设置单元测试样板。 我们的前端项目使用ES6类构建,并且依赖于我们的核心产品。 前端代码通过整个其他代码块中的构建过程进行封装,该代码块基本上是一个闭包并捕获依赖项。 因此,我们不必手动导入它以便使用它。
假设依赖项称为productScope
,它是一个对象,它包含一些DOM模型,内部API和参数以及每个项目所需的许多其他内容。 目前,Mocha抛出ReferenceError: productScope is not defined.
我怎么能模仿这个对象? 或者我应该只使用实际的对象?
例:
class someClass {
constructor() {
const id = productScope.items[0].id
const item = productScope.domModel.querySelector('.some-div')
item.classList.add(`added-${id}`)
}
}
这包含在核心代码中,如下所示:
(function(productScope) {
// front end code goes here
}(productScope)
测试文件:
import someClass from '../../js/someClass'
describe('someClass', function() {
const someClass = new someClass()
it('should be a class', function() {
console.log(someClass)
});
});
看起来productScope
是一个全局变量。
这样的事情对你有用。
import someClass from '../../js/someClass';
describe('someClass', function() {
let someClass;
beforeEach(() => {
global.productScope = {
// you mock definition
someClass = new someClass();
};
});
it('should be a class', function() {
console.log(someClass)
});
});
你可以尝试这样的事情
describe('#someClass', () => {
let someClass;
beforeEach(() => {
global.productScope = {
// mocking productScope object
};
});
it('should be a class', () => {
someClass = new SomeClass;
console.log(someClass);
});
afterEach(() => {
delete global.productScope;
});
});
或者,如果您想为每个测试用例提供更具体的模拟逻辑
describe('#someClass', () => {
let someClass;
it('should be a class', () => {
global.productScope = {
// mocking productScope object
};
// Test logic start
someClass = new SomeClass;
console.log(someClass);
// Test logic end
delete global.productScope;
});
});
我也有其他答案,因为管理global
变量似乎是最简单,最直接的解决方案。
但是,您可以使用toString来获取类的字符串表示形式,并将其eval以绑定到closure的作用域:
class someClass { constructor() { this.id = scopedId } } // pass class as an argument function scopeFactory(classDef) { // define scoped data let scopedId = 2; // eval is used to bind class to the local closure // so `scopedId` will be in charge return eval("(" + classDef + ")"); } const scopedSomeClass = scopeFactory(someClass); console.log(new scopedSomeClass)
请注意, eval(someCLass.toString())
在没有括号的情况下不起作用 。
您可以将它作为辅助函数添加到项目中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.