2017-06-29 52 views
0

我們有一個NodeJS應用程序書寫打字稿。 我們使用模塊來導出幾個函數,而不是對象。在Typescript&NodeJS中嘲笑模塊導出的最佳實踐

一旦我們想在測試過程中嘲笑這些功能,我們使用mock-require

但是,代碼變成非常難看。因爲我們需要基本

  1. 進口mock-require
  2. 建立我們的嘲笑和間諜
  3. import {functionA,FunctionB} from "module-to-test"
  4. mock.reRequire("module-to-test")

代碼看起來有點像這樣:

// mocking require imports 
import * as mock from "mock-require"; 
import {getMockUserObject} from "../../test/utils/mock-objects"; 

const user = getMockUserObject(); 
let userModelSpy; 

// mock userModel 
userModelSpy = jasmine.createSpyObj("userModelSpy", ["findOne"]); 
userModelSpy.findOne.and.returnValue(Promise.resolve(user)); 
mock("../data-source/mongo-data-source", {userModel: userModelSpy});  

// actual import statements 
import {functionA,FunctionB} from "module-to-test"; 

// reRequire the module that we want to test 
mock.reRequire("./mail.service"); 

有什麼辦法可以讓這不像醜陋?例如。保持進口。 如果我們將嘲諷移入beforeEach或通常在實際的測試模塊導入下方,reRequire不起作用,或者至少我們的嘲笑不會被調用。所以模塊測試使用的是實際的依賴關係而不是模擬的依賴關係。

感謝您的輸入!

回答

1

嘲笑可能是一個ES6模塊的痛苦和TypeScript有相同的問題。我採用了不同的方法:我使用構造函數注入,而不是模擬實際導入。這樣,任何模擬都可以注入被測單元。

下面是一個例子:

import {someDependency} from "./someDependency"; 

export class Unit { 
    private someDependency; 
    constructor(someDependency) { 
     this.someDependency = someDependency; 
    } 
} 

而且單元測試:

import {Unit} from "./Unit"; 

const mock: any =() => {}; 
const unit = new Unit(mock); 

這樣,我也不需要有依賴進口,在所有的單元測試。

還有其他的方法,但到目前爲止,我發現這是最乾淨的。

注意:註釋模擬any告訴TypeScript允許它們在構造函數中,儘管類型不匹配。

+0

嗨mingos。我從角度知道這種方法。但是如果一個人不想使用類,因爲它只是一堆功能(例如Express中的路由器)。我猜想,在幕後,類只是功能,應該有辦法做到這一點。 – pascalwhoop

+0

我不知道這個答案。就個人而言,我集成了測試控制器而不是單元測試它們。 – mingos