在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
的有效子类型。