2017-09-15 70 views
1

我想嘲笑一個全局變量,並測試它是否在我的函數中被調用過。在我的文件中,我定義了一個全局變量「remote」,它實現了一個Subject(RxJS庫)的實例化。我只想測試一下Subject的下一個函數是否已經用右參數「name」調用。但是,我無法在我的測試文件中訪問全局變量遠程。我試圖在我的設置文件中嘲笑它,但不起作用。如何使用Jest在單元測試中訪問全局常量?

我該怎麼做?

const remote = new Subject(); 
const analytics = { 
    click: (name) => { 
    if (name) { 
     remote.next(name); 
    } 
    } 
} 
module.exports = analytics; 

謝謝!

+0

我猜你正在使用的WebPack,和'remote'不是一個全局變量 – Zen

+0

嘿@Zen感謝您的回答。是的我使用webpack。 Jest告訴我,它不知道新Subject的「next」屬性(如果你對observables有一些瞭解,接下來是Subject類的經典方法)。任何關於如何讓Jest知道「遠程」變量的想法? – Megan

回答

1

這是一個很好的問題。當你使用webpack時,你的個人文件被包裝到不同的函數調用中。看看這doc
這個問題最好的部分是它顯示了IOC/DI的必要性,如果你希望你的代碼是可測試的。您可以導出Analytics類,而不是在本地模塊中定義remote,然後將remote注入到其構造函數中。

// Analytics.js 
export default class Analytics{ 
    constructor(remote) { 
    this.remote = remote 
    } 

    click(name) { 
    if (name) { 
     this.remote.next(name) 
    } 
    } 
} 

main.js 
import Analytics from './Analytics' 

const remote = new Subject() 
const analytics = new Analytics(remote) 
analysis.click('foo') 

將依賴關係注入到所有組件/服務將是單調乏味的。關於爲什麼/如何簡化它,Angular有an decent doc。希望這有幫助!

//更新
您可以使用窗口使用window.remote

const remote = new Subject() 
window.remote = remote 

來定義測試全局常量和訪問它時,你想遠程嘲笑,記得要修改它的屬性,而不是對它的引用。

// test.js 
beforeEach(() => { 
    // wrong !!! 
    window.remote = { 
     next(name) { assert(name) } 
    } 

    // right 
    window.remote.next = name => assert(name) 
}) 
+0

非常感謝!文檔NodeJS非常有用。我同意這個解決方案是最好的解決方案;然而,林與遺產代碼工作,我不能重構...任何想法如何我可以測試它呢? – Megan

+0

我已經更新了我的答案。檢查出來@Megan – Zen

+0

謝謝@Zen,我會檢查出來! – Megan

相關問題