Mar*_*ark 6 stub sinon typescript
我正在尝试使用 stub 类实例,sinon.createStubInstance但我收到一个错误,指出缺少私有成员变量。当然我也不能明确设置它,因为它是一个私有成员。
示例类:
class Foo {
private readonly bar: string;
constructor(bar: string) {
this.bar = bar;
}
}
class Parent {
foos: Foo[];
constructor(foos: Foo[]) {
this.foos = foos;
}
}
Run Code Online (Sandbox Code Playgroud)
在测试中,我正在编写一个beforeEach块:
beforeEach(function () {
const stubFoo = sinon.createStubInstance(Foo);
const stubParent = sinon.createStubInstance(Parent);
stubParent.foos = [stubFoo]; // Tslint error here
});
Run Code Online (Sandbox Code Playgroud)
Tslint 错误是:
“SinonStubbedInstance”类型中缺少属性“bar”,但“Foo”类型中需要
作为记录,我使用的是 Typescript v3.0.3 和 Sinon v7.4.1。
实际上有一个比强制转换存根更好的解决方法,发布在 github 上:
import { createStubInstance, StubbableType, SinonStubbedInstance, SinonStubbedMember } from 'sinon';
export type StubbedClass<T> = SinonStubbedInstance<T> & T;
export function createSinonStubInstance<T>(
constructor: StubbableType<T>,
overrides?: { [K in keyof T]?: SinonStubbedMember<T[K]> },
): StubbedClass<T> {
const stub = createStubInstance<T>(constructor, overrides);
return stub as unknown as StubbedClass<T>;
}
Run Code Online (Sandbox Code Playgroud)
然后您可以这样使用它:
beforeEach(function () {
const stubFoo: StubbedClass<Foo> = createSinonStubInstance(Foo);
const stubParent: StubbedClass<Parent> = createSinonStubInstance(Parent);
stubParent.foos = [stubFoo]; // No more Tslint error here
});
Run Code Online (Sandbox Code Playgroud)
它在不同的配置上为我工作,并为我的类和Sinon的存根实例带来了所有自动完成功能。