2016-07-29 105 views
1

我有一個使用ES2015模塊語法的代碼庫,即。 import foo from 'bar'。它也有這樣的代碼:如何使用JSDom包裝導入?

// setup.js 
var foo = window.foo || ''; 

我想用jsdom爲我的測試環境提供了一個模擬的DOM,但我無法弄清楚如何換我導入的代碼。該import語句來任何代碼之前,所以我不能做到這一點:

import jsdom; 

jsdom({ 
    html: '<div></div>', 
    done:() => { 
     import setup from 'setup'; 
    } 
}) 

但是如果我離開進口在頂部,屬於它的地方,window引用之前jsdom可以參與:

import foo from 'bar'; // this uses the DOM 
import jsdom; 

jsdom({ 
    html: '<div></div>', 
    done:() =>() => { console.log('foo'); } 
}) 

有什麼辦法可以解決這個問題,而不需要改用AMD或CommonJS?

回答

0

所以事實證明,我只是需要閱讀規範...或在我的情況下,一個輝煌的博客,打破了我的規範(謝謝②ality!)的確,你不能import foo from 'bar'函數內,但事實證明,這不是ES6中import的唯一途徑。還有System.import ...

jsdom.env({ 
    html: '<div></div>', 
    done:() => { 
     System.import('setup') 
      .then(setup) => { 
       // code that uses setup, now JSDom-wrapped 
    } 
}); 

請注意,如果你正在做的這一切都通過一個測試運行像摩卡運行代碼,你需要告知你的測試運行做一個異步等待負載。換句話說(對於摩卡),您需要使用done參數,如下所示:

jsdom.env({ 
    html: '<div></div>', 
    done:() => { 
     describe('foo',() => { 
      it('does something', (done) => { 
       System.import('setup') 
        .then(setup) => { 
         // code that uses setup, now JSDom-wrapped 
         done(); // tell Mocha we're finished 
        }); 
      }); 
     }); 
    }); 
});