2014-12-13 23 views
3

這似乎在進口打字稿的常用方法防止被嘲笑模塊......假設我有寫在一個打字稿node.js的項目下面的產品代碼,我想測試:在使用Typescript進行Mocha測試時使用Mockery有訣竅嗎?

// host.ts 
import http = require('http'); 

export class Host { 

    public start(port: number): http.Server { 
     return http.createServer().listen(port); 
    } 
} 

我有使用嘲笑(d.ts in pull request #3313)和摩卡以下單元測試:

import chai = require('chai'); 
import mockery = require('mockery'); 
import webserver = require('../hosting/host'); 

describe('host',(): void => { 
    describe('start()',(): void => { 
     before(() : void => { 
      mockery.enable(); 
     }); 
     after((): void => { 
      mockery.deregisterAll(); 
      mockery.disable(); 
     }); 

     it('should create an http server',(): void => { 

      mockery.registerMock('http', { 
       Server: mocks.Server, 
       createServer: (app: any) : any => new mocks.Server(app) 
      }); 
      var host: webserver.Host = new webserver.Host({ port: 111 }); 
      var server: any = host.start(); 

      chai.expect(server).is.instanceOf(mocks.Server); 
     }); 

    }); 
}); 

module mocks { 
    'use strict'; 

    export class Server { 
     app: any; 

     constructor(app: any) { 
      this.app = app; 
     } 
    } 
} 

的問題是,當import webserver = require('../hosting/host')被稱爲在測試的模擬的功能不設置尚未並返回未嘲笑require('http')。我試圖在Host.start函數中嘗試var http = require('http'),但是這會阻止將http.Server聲明爲返回值。

我應該如何着手在Mocks中使用Typescript進行單元測試?有更好的圖書館比嘲笑更好嗎?

回答

5

經過了整整一天的網絡衝浪之後,我終於明白了:是的,在使用Typescript進行Mocha測試時使用Mockery是一個竅門。訣竅是使用typeof標識符來引用模塊。我在the Optional Module Loading and Other Advanced Loading Scenarios in this document中發現了這個。

我更新的代碼現在看起來是這樣的:

// host.ts 
import httpDef = require('http'); 

export class Host { 

    public start(port: number): httpDef .Server { 
     var http: typeof httpDef = require('http'); 
     return http.createServer().listen(port); 
    } 
} 

這讓我建立我的摩卡測試嘲笑這樣的:

import chai = require('chai'); 
import mockery = require('mockery'); 
import webserver = require('../hosting/host'); 

import httpDef = require('http'): 

describe('host',(): void => { 
    describe('start()',(): void => { 
     before(() : void => { 
      mockery.enable(); 
     }); 
     after((): void => { 
      mockery.deregisterAll(); 
      mockery.disable(); 
     }); 

     it('should create an http server',(): void => { 
      var mockServer: httpDef.Server = <httpDef.Server>{}; 
      var mockHttp: typeof httpDef = <typeof httpDef>{}; 
      mockHttp.createServer =() : httpDef.Server => mockServer; 

      mockery.registerMock('http', mockHttp); 

      var host: webserver.Host = new webserver.Host({ port: 111 }); 
      var server: any = host.start(); 

      chai.expect(server).is.equals(mockServer); 
     }); 

    }); 
}); 

,其中這可以用於依賴的其他場景注射可以發現here

相關問題