2016-05-21 69 views
0

我想單元測試我構建的模塊。 舉個什麼樣子差不多.. MyModule的一個印象:Node.js我應該如何單元測試調用其他函數的函數

function MyModule(...) { 
    var self = this; 
    MyModule.init.call(self, ...); 
} 

util.inherits(MyModule, MySuperModule); 

MyModule.init = function(...) { 
... 
}; 

MyModule.prototype.logic = function(..., done) { 
    calls fnA, fnB, fnC, fnD conditionally 
    done(...) 
}; 

MyModule.prototype.fnA = function(...) { 
... 
}; 

MyModule.prototype.fnB = function(...) { 
... 
}; 

MyModule.prototype.fnC = function(...) { 
... 
}; 

MyModule.prototype.fnD = function(...) { 
... 
}; 

MySuperModule:

function MySuperModule(...) { 
    ... 
    } 

    MySuperModule.prototype,fn = function(..., done) { 
     var self = this; 
     ... 
     self.logic(..., function done(...) { 
      ... 
      done(...) 
     }); 
    } 

現在MyModule.logic()永遠不會被用戶顯式調用,它只是調用MySuperModule.fn()。 對於所有其他的MyModule函數也是如此,這些函數根據傳遞給委託鏈的給定參數有條件地調用。

我的問題如下:

  • 我需要有涵蓋所有可能出現的情況
  • 我知道我需要測試功能的不同參數分別測試所有MyModule的功能或只是測試MySuperModule.fn() (如果我做我以前的問題是錯誤的,因爲我根本不會真的測試MyModule函數),我將如何使用MySuperModule.fn(),因爲它的done()回調是調用依賴於調用MyModule.logic()done()回調的參數,這又取決於提供給MySuperModule.fn()參數的參數。

回答

1

在我看來,你應該測試單個函數,而不管它們是否被用戶直接調用。

單元測試的目的是試圖確保測試的各個單元完成他們所期望的任務。如果您(相對)確信您的個人職能/單位表現得如預期一樣,那麼您可以更有信心地相互配合。

很難從代碼中真正收集到模塊的性質,因此建議如何實施測試很困難。但是,您所要求的是如何驗證您的done/callback函數是否被調用以及使用哪個參數。爲此我建議使用存根。我通常使用sinon,但我相信其他類似的工具可用。

var sinon = require("sinon"); 
    var should = require("chai").should(); 
    var yourModule = require("your-module"); 

    var doneStub = sinon.stub(); 
    yourModule.yourFunction(..., doneStub); 
    doneStub.should.have.been.called; 
    var args = doneStub.getCall(0).args; 
    args[ 0 ].should.be.eql(...); 
    // etc etc 

您還應該考慮使用測試跑步者,我喜歡mocha

0

您應該進行漸進式測試。你應該測試每個功能。 這裏你如何繼續。

  1. 爲父函數編寫測試用例。嘲笑它調用的內部函數。您可以使用sinon庫進行嘲弄。
  2. 對於第二個問題,您可以使用sinon mock的yield函數來模擬任何回調函數,並且您還可以指定該回調所需的輸出。通過這種方式,您可以使用不同的方案測試您的多個自定義輸出的功能。
1

這真的取決於你如何在MySuperModule上注入MyModule。但首先我會指出,在單元測試中,您必須單獨測試MyModule,使用MyModule中的Mocked版本和所有其他依賴項來測試MySuperModule。這是因爲你不想測試MyModule兩次,不需要這個。

所以創建存根有一個名爲Sinon.JS的庫,它工作得很好。

因此,如果出於任何原因,您只是想讓MyModule間諜,這意味着您只需將偵聽器附加到MyModule(它應用於MyModule方法),該偵聽器會計數並告知是否曾經調用過某個給定的方法, 。

var MyModuleMethodASpy = sinon.spy(MyModulem 'MethodA'); 
MySuperModule.someMethod(); 
assert(MyModuleMethodASpy.called) 

所以這個代碼創建了一個間諜,引發對MySuperModule和檢查一些方法,如果MyModule.MethodA()是不斷調用。

您可以創建存根,以及如果你想控制哪些依賴於具體的方法,例如回報:

var MyModuleStub = sinon.stub(MyModule, 'MethodA').returns([...somedata]); 
相關問題