node.js - 在 mocha 测试中,是否有一个技巧来欺骗?

  显示原文与译文双语对照的内容
0 0

通常,在通讯录中导入通常的方法会阻止模块被仿真。"。 假设我在 node.js 项目中编写了以下产品代码,我希望测试这些代码:

//host.ts
import http = require('http');
export class Host {
 public start(port: number): http.Server {
 return http.createServer().listen(port);
 }
}

我有下面的单元测试 使用嘲弄( 请求 #3313 中的d.ts ) 和 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') 被称为测试中的模拟尚未设置,而且返回的is被返回。 我试着尝试 var http = require('http')Host.start 函数中,但这可以防止将 http.Server 声明为返回值。

我应该如何使用mock在 Typescript implementing执行单元测试? 有比嘲笑更好的库?

时间:原作者:1个回答

0 0

在我浏览网络的一天之后,我终于了解到: 是的,有一个在 mocha 测试中使用with的欺诈。 技巧是使用 typeof 标识符来引用模块。 我在中发现了这个文档中可选的模块加载和其他提前加载场景。

我的更新代码现在看起来如下所示:

//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);
 }
}

这样我就可以像这样在 mocha 测试中设置 mock:

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);
 });
 });
});

可以在这里找到一些可以用于依赖注入的其他场景,这里是

原作者:
...