【发布时间】:2020-11-24 12:40:04
【问题描述】:
我正在 TypeScript 中使用 mocha、chai 和 sinon 编写单元测试。我需要测试一个构造函数需要一个对象作为输入参数的类,我想模拟它,因为它太复杂而无法创建。此外,该类的某些方法使用该特定输入参数对象的属性。所以我还需要模拟该模拟对象的方法。
也许有些代码会让它更清晰:
我的班级看起来像这样(简化):
class Controller {
constructor(context: Context) {
this._context = context;
}
protected get elasticSearch(): Client {
return this._context.clients.elasticSearch;
}
// the next method should be tested
public async getSomething(input1: string, input2: string): Promise<ResultObject> {
const result = new ResultObject();
await this.elasticSearch.search(query).then((_res)=>{
// do something with _res
result.prop = _res;
});
return result;
}
}
现在我想测试getSomething 函数。为此,我首先需要创建一个 Controller 对象。但是构造函数需要一个我没有的 Context 对象。为此,我已经尝试了以下两种方法:
const controllerStub = sinon.createStubInstance(Controller);
controllerStub.elasticSearch = sinon.stub();
--------------------------------------------------
const contextMock = <Context>{};
const controller = new Controller(contextMock);
controller.elasticSearch = sinon.stub();
controller.elasticSearch.search = sinon.stub();
这两个都不起作用,因为属性 elasticSearch 不存在于类型 SinonStubbedInstance<Controller> 上,并且我无法首先设置 elasticSearch 属性,因为它只有一个 getter。
所以现在我真的不知道要模拟什么以及如何测试 getSomething 函数。在最好的情况下,我想说elasticsearch.search(query) 返回一个定义的值,这个特定的值应该在 .then 部分进一步处理。我想跳过 elasticSearch 访问,但仍希望运行 .then 部分。
所有关于存根和嵌套存根的文档都没有帮助我。
【问题讨论】:
-
ResultObject是什么? -
它只是一个定义结果结构的类。带有消息、错误和成功属性。它可能与问题无关。
标签: typescript unit-testing mocha.js chai sinon