【发布时间】:2015-02-12 05:26:32
【问题描述】:
在打字稿中导入的常用方法似乎可以防止模块被模拟......假设我在一个用打字稿编写的node.js项目中有以下产品代码,我想测试:
// host.ts
import http = require('http');
export class Host {
public start(port: number): http.Server {
return http.createServer().listen(port);
}
}
我使用 mockery (d.ts in pull request #3313) 和 mocha 进行了以下单元测试:
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 中实现单元测试?有没有比 mocky 更好的库?
【问题讨论】:
标签: node.js unit-testing typescript mocha.js