在Typescript中使用SinonJS时,私有属性报告为丢失
我正在尝试使用在Typescript中使用SinonJS时,私有属性报告为丢失,typescript,sinon,stub,Typescript,Sinon,Stub,我正在尝试使用sinon.createStubInstance存根类实例,但我收到一个错误,指出缺少一个私有成员变量。当然,我也不能显式地设置它,因为它是一个私有成员 示例类: class Foo { private readonly bar: string; constructor(bar: string) { this.bar = bar; } } class Parent { foos: Foo[]; constructor(foos: Foo[]) {
sinon.createStubInstance
存根类实例,但我收到一个错误,指出缺少一个私有成员变量。当然,我也不能显式地设置它,因为它是一个私有成员
示例类:
class Foo {
private readonly bar: string;
constructor(bar: string) {
this.bar = bar;
}
}
class Parent {
foos: Foo[];
constructor(foos: Foo[]) {
this.foos = foos;
}
}
在测试中,我在每个块之前编写一个:
beforeEach(function () {
const stubFoo = sinon.createStubInstance(Foo);
const stubParent = sinon.createStubInstance(Parent);
stubParent.foos = [stubFoo]; // Tslint error here
});
Tslint错误为:
类型“SinonSubbedInstance”中缺少属性“bar”,但
类型“Foo”中需要
作为记录,我使用的是Typescript v3.0.3和Sinon v7.4.1。实际上有一个比强制铸造存根更好的解决方法:
从'sinon'导入{createStubInstance,StubbableType,sinonSubbedInstance,sinonSubbedMember};
导出类型StubbedClass=SinonStubbedInstance&T;
导出函数createsInInstance(
构造函数:StubbableType,
重写?:{[K in keyof T]?:sinostubbedmember},
):存根类{
const stub=createStubInstance(构造函数,重写);
返回与StubbedClass一样未知的存根;
}
然后,您可以这样使用它:
在每个(函数()之前{
常量stubFoo:StubbedClass=createsininstance(Foo);
常量stubParent:StubbedClass=createsininstance(父级);
stubParent.foos=[stubFoo];//此处不再出现Tslint错误
});
它在不同的配置上对我有效,并为我的类和Sinon的stubbed实例带来了所有的自动完成功能。您可以这样做以快速解决:
stubParent.foos = [stubFoo as unknown as Foo];
到写这篇文章的时候,我还没有找到任何优雅的方法来解决这个问题。在中非常有效。您的TypeScript版本很旧(我们目前的版本是3.6.3),所以我建议您更新它。@frankie567底部缺少键行stubParent.foos=[stubFoo]代码>。谢谢你提醒我打字稿的版本。哦,是的,对不起,我错过了。这里的问题是stubFoo
属于sinonstubedinstance
类型,它不是Foo
的子类型,因此不可赋值。您可以做的是将其强制转换为stubParent.foos=[stubFoo]
;虽然不是很优雅,但是测试设置可能会很麻烦。不幸的是,在这种情况下,它需要stubParent.foos=[stubFoo]
,因为没有对
的初始转换,它仍然抱怨没有定义私有属性。如果我在一切正常的情况下公开了成员,sinonSubbedInstance
是Foo
的有效子类型。