[英]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.