我正在尝试使用 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
。
我尝试过的来自
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