單元測試-如何使用Mocha測試“正常”(非特定于節點的)JavaScript函數?

這看起來應該非常簡單; 但是,經過兩個小時的閱讀和反復試驗卻沒有成功,我承認失敗并問你們!

我正在嘗試將Mocha與Should.js結合使用以測試一些JavaScript函數,但是我遇到了范圍界定問題。 我已經將其簡化為最基本的測試用例,但是我無法使其正常工作。

我有一個名為global的文件,其中僅包含以下內容:

function testFunction() {
    return 1;
}

和我的global(位于同一文件夾中)內容:

require('./functions.js')
describe('tests', function(){
    describe('testFunction', function(){
        it('should return 1', function(){
            testFunction().should.equal(1);
        })
    })
})

該測試失敗,并顯示global

我能看到原因,因為我發現的大多數示例都將對象和函數附加到Node global對象或使用module.exports導出它們,但是使用這兩種方法都意味著我的函數代碼會在標準瀏覽器情況下拋出錯誤,在這種情況下 這些對象不存在。

那么,如何不使用特定于節點的語法訪問與測試分開的腳本文件中聲明的獨立函數?

asked 2020-02-23T01:11:15Z
3個解決方案
27 votes

多虧了這里的其他答案,我的工作才有意義。

但是沒有提到的一件事(可能是因為Noders之間的常識)是您需要將tests.js調用的結果分配給變量,以便從測試套件中調用導出的函數時可以引用它 。

這是我完整的代碼可以领救济金的游戏可以领救济金的游戏,以供將來參考:

tests.js:

function testFunction () {
    return 1;
}
// If we're running under Node, 
if(typeof exports !== 'undefined') {
    exports.testFunction = testFunction;
}

tests.js:

var myCode = require('./functions')
describe('tests', function(){
    describe('testFunction', function(){
        it('should return 1', function(){
           
answered 2020-02-23T01:13:20Z
19 votes
require('./functions.js')

這不會做任何事情,因為您沒有導出任何東西。 您所期望的是module.exports在全球范圍內可用,與

global.testFunction = function() {
    return 1;
}

您只是無法繞過導出/全局機制。 這是節點的設計方式。 沒有隱式的全局共享上下文(如瀏覽器上的module.exports)。 模塊中的每個“全局”變量都被包含在其上下文中。

您應該使用module.exports。如果打算與瀏覽器環境共享該文件,則可以通過多種方法使其兼容。 要進行快速破解,只需在瀏覽器中執行window.module = {}; jQuery.extend(window, module.exports),或者對節點執行if (typeof exports !== 'undefined'){ exports.testFunction = testFunction }

answered 2020-02-23T01:11:46Z
7 votes

如果要通過要求使任何模塊可用,則應使用

module.exports

如你所知 ;)

如果您想在Node和瀏覽器中使用模塊,則有解決方案

function testFunction() {  }
if (typeof exports !== 'undefined') {
   exports.testFunction = testFunction
}

這樣,您將能夠在瀏覽器和節點環境中使用該文件

answered 2020-02-23T01:13:53Z
translate from