【发布时间】:2021-07-28 11:54:18
【问题描述】:
我有一个这样的类方法:
export class MyClass {
@myDecorator()
public async createItem(itemId: string, itemOptions: ItemOption[]): Promise<boolean> {
// ...
// return await create Item
}
}
我在另一个文件中定义了这样的装饰器:
export function myDecorator() {
return function check(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const newDescriptor = Object.assign({}, descriptor);
// do something ...
return newDescriptor;
}
}
现在我想对 createItem 方法而不是装饰器进行单元测试,只对方法进行单元测试。但是由于装饰器的作用有点重(其中甚至有数据库访问),我需要模拟它,以便它不会在单元测试中执行。
我在单元测试中使用 mocha 和 sinon,并且已经尝试了以下方法来模拟装饰器:
const decorator = require('./decorator/MyDecorator');
describe('test createItem method', function () {
it('should return valid result', async function () {
// 1. try
decorator.myDecorator = () => sinon.fake();
// 2. try
const decoratorStub = sinon.stub(decorator, 'myDecorator');
decoratorStub.return(true);
// rest of test
const myClass = new MyClass();
let result = await myClass.createItem(itemId, options);
expect(result).to.be.equal(true);
}
}
两次尝试都不成功。无论如何,装饰器都被执行了,但我实际上只是想跳过它。
我怎样才能做到这一点?
【问题讨论】:
标签: typescript unit-testing mocha.js decorator sinon