使用 sinon 存根属性

问题描述 投票:0回答:1

我正在尝试使用 sinon 创建一个存根实例并在存根中使用特定的属性值。

这是我的代码:

// MyClass
export default class MyClass {
  public constructor(public readonly myParameter: string) {}
}

// MyClass test
import MyClass from "../src/index";
import sinon from "sinon";

describe("stubs", () => {
  it("should pass", () => {
    const myClass = sinon.createStubInstance(MyClass);
    sinon.stub(myClass,'myParameter').value('a');
    expect(myClass.myParameter).toBe("a");
  });
});

但是这不起作用。我得到的错误是:

TypeError: Cannot stub non-existent property myParameter

注意:我还检查了问题是提升的构造函数属性还是

readonly
的事实,但似乎不是这样,我在类主体中也遇到了同样的问题。
public myParameter: string

我尝试过的来自

这个问题,但它不起作用,而且我不这样做,因为这是一个存根实例而不是一个简单的存根,但我不知道如何让它工作。

沙盒链接

javascript jestjs sinon
1个回答
0
投票
尽我所能回答我自己的问题:

TS代码:

export default class MyClass { public constructor(public readonly myParameter: string) {} public someMethod() {} }
基本上翻译为 JS 类,例如:

export default class MyClass { constructor(myParameter) { this.myParameter = myParameter; } }
由于我使用 

createStubInstance

 这确实会导致构造函数未被调用,因此 
myParameter
 未在实例上设置,因此 
sinon
 说它不存在是正确的。

对我有用的直接解决方案基于@jonrsharpe 建议。我需要以某种方式确保该属性存在,然后才能对其进行存根,例如:

describe("stubs", () => { it("should pass", () => { const myClass = sinon.createStubInstance(MyClass); // "as any" required in TS since property is readonly and transpiler would complain (myClass as any).myParameter = null; sinon.stub(myClass, "myParameter").value("a"); expect(myClass.myParameter).toBe("a"); }); });
这可能看起来毫无意义(它确实是针对字符串值),但对于更复杂的类型,您可以轻松地遵循此方法,例如例如,如果您的财产是另一类,您可以这样做:

const myClass = sinon.createStubInstance(MyMoreComplexClass); // "as any" required in TS since property is readonly and transpiler would complain (myClass as any).myClassInstanceParameter = null; sinon.stub(myClass, "myClassInstanceParameter").value(sinon.createStubInstance(MyOtherClass))); expect(myClass.myParameter.otherClassMethod).toBe(null); // It's there but no stub behaviour defined
    
© www.soinside.com 2019 - 2024. All rights reserved.