2017-01-25 95 views
0

因此,我正在使用企業工具,我們在其中嵌入了JavaScript腳本。這些腳本可以訪問某些內置對象。使用模擬對象在JavaScript中進行單元測試

不幸的是,該工具沒有提供任何好的方法來單元測試這些腳本。所以我的想法是將腳本保存在回購站中,模擬內置對象,然後設置在我的系統上運行的單元測試。

我對JavaScript如何在構建,類加載等方面的工作非常無知,但我一直在嘗試的東西,看看有什麼作品。我開始嘗試使用Mocha作爲節點項目(儘管它只是一個充滿腳本的目錄,而不是真正的節點項目)。默認的測試有效,但是當我嘗試從我的代碼中測試函數時,出現編譯器錯誤。

下面是我的項目中的示例腳本的外觀。我希望測試的功能,而不是整個腳本:

var thing = builtInObject.foo(); 
doStuff(thing); 
doMoreStuff(thing); 

function doStuff(thing) { 
    // Code 
} 

function doMoreStuff(thing) { 
    // More Code 
} 

這是一個測試文件看起來是這樣的:當我輸入(「規定」)的腳本

var assert = require('assert'); 
var sampleScript = require('../scripts/sampleScript.js'); 

describe('SampleScript', function() { 
    describe('#doStuff()', function() { 
     it('should do stuff', function() { 
       assert.equal(-1, sampleScript.doStuff("input")); 
     }); 
    }); 
}); 

問題發生。我得到編譯錯誤,因爲它不是builtInObject。有沒有什麼辦法可以用mock「注入」那些內置的對象?所以我定義了這些對象包含的變量和函數,編譯器知道它們是什麼?

我接受其他框架或想法。對不起,我的無知,我不是一個真正的JavaScript傢伙。而且我知道這有點冒險,但它似乎是最好的選擇,因爲我沒有退出企業工具。

回答

1

因此,如果我正確地做到了,您希望在Node.js環境中對前端文件進行單元測試。

有一些併發症。

首先,根據Node.js,每個文件都有自己的作用域,因此即使您需要該文件,文件內定義的變量也不可訪問。所以你需要輸出變量來使用它們。

module.exports.doStuff = doStuff; //in the end of sample script 

其次,您在開始使用像要求他們將是不確定的,所以你會得到一個錯誤的前/ module.exports。

運行你的代碼最簡單的方法是。示例腳本中:

var isNode = typeof module !== 'undefined' && module.exports; 
if (isNode) { 
    //So we are exporting only when we are running in Node env. 
    //After this doStuff and doMoreStuff will be avail. in the test 
    module.exports.doStuff = doStuff; 
    module.exports.doMoreStuff = doMoreStuff; 
} 

什麼是builtInObject。簡單的方法來嘲笑它將在測試之前,需要做以下內容:

global.builtInObject = { 
    foo: function() { return 'thing'; } 
}; 

該測試剛剛通過了我。見the sources

無論如何,全局變量並不好。但在這種情況下,你似乎無法避免使用它們。

或者你可以通過配置類似Karma來避免使用Node.js。它在物理上啓動瀏覽器並在其中運行測試。 :)

+0

謝謝,你的方法大部分適用於我!一對夫婦跟進問題: 1。我是否也可以預定課程?有像「var builtInClass = new BuiltInClass();」的代碼以及。 2.我可以模擬一個函數的返回(就像java中的mockito那麼返回())?當我測試doMoreStuff時,我不想讓doStuff真正被調用,但我可能需要返回值。 @ antonio-narkevich – user2014969

+0

我想我有點想出#2。使用sinon.stub我可以嘲笑doStuff()的返回。問題是,我的代碼現在被編寫的方式,它需要函數模擬或在require()時失敗。在需求之後,嘲笑該功能需要發生。我想我可能會重構我的代碼來解決這個問題。編輯:是的,我想出了一個辦法。對不起,我把它變成了我的編碼思想過程博客。 – user2014969

+0

嘿男人。關於#1。可能你可以做一些像globa.BuiltInClass = function(){}的東西,你會沒事的。 :) –

相關問題