在 Typescript 私有属性中使用 SinonJS 时报告为缺少

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。

Bon*_*lou 0

实际上有一个比强制转换存根更好的解决方法,发布在 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的存根实例带来了所有自动完成功能。