Jest.js 使用Sinon对属性进行存根

fzwojiic  于 11个月前  发布在  Jest
关注(0)|答案(1)|浏览(145)

我尝试使用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也有同样的问题。
我已经尝试了来自this question,但它不工作,我不,如果这是因为这是一个存根示例,而不是一个简单的存根,但我不知道如何让它工作。
Sandbox link

tpgth1q7

tpgth1q71#

根据我的理解来回答我自己的问题:
TS代码:

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

字符串
基本上可以转换为一个JS类,比如:

export default class MyClass {
    constructor(myParameter) {
        this.myParameter = myParameter;
    }
    someMethod() { }
}


由于我使用了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

相关问题