2016-03-05 28 views
0

假設以下兩個ES6類:模擬ES6依賴性當單元測試

我-random.js:

export default class MyRandom { 
    get() { return Math.random(); } 
} 

app.js:

import MyRandom from './random'; 

export default class App { 
    get() { 
     let r = new MyRandom(); 
     let total = r.get() * r.get(); // Complex calc goes here! 
     return total; 
    } 
} 

現在我想單元從app.js測試get。所以我想模擬MyRandom。藤本,我發現一個很有趣的庫Mocktail

根據該文檔,你應該改變我的-random.js到

import {mock} from 'mocktail'; 
class MyRandom { 
    get() { return Math.random(); } 
} 
export default mock(MyRandom); 

在您的測試文件,你必須告訴你正在測試的環境如下:

import {env, ENV, inject} from 'mocktail'; 
env(ENV.TESTING); 

class MyRandomMock { 
    get() { 
     return 10; // Not so random anymore 
    } 
} 
inject('MyRandom', MyRandomMock); 

而且你應該可以測試app.js。不幸的是,當我嘗試這種方式時,MyRandom永遠不會被模擬類取代。任何幫助,將不勝感激!!

我已經在github here上設置了一個測試項目來演示這個問題。正如你可以看到,如果有更好的方法來實現我需要什麼,請告訴我該測試將失敗:(

回答

1

我認爲你需要在你的測試文件App之前導入setup,這將注入模擬並使其在應用程序中調用。

import './setup';  
import App from '../src/app';