ts-stubber
v1.0.3
Published
Lazy Stubbing a TypeScript Class or Interface with any Mocking Framework for testing in Isolation
Downloads
272
Maintainers
Readme
ts-stubber / Exports
ts-stubber
A generic stubbed instance creator to lazy stub any interface/class, while completely avoiding calling class's constructor. Thus, enabling both avoiding side effects that may occur while class constructor is activated and mocking Classes with no default constructor.
Markdown Documentation
HTML Documentation
Installation
npm i -D @ts-stubber
or
yarn add -D @ts-stubber
Usage
This library provides an API to create a stubbed instance of a class or interface, including property functions, allowing overrides of methods, setters and getters..
class MyClass {
constructor(input: number) {
throw new Error("Should not be called");
}
func(input: number, text: string) {
console.log(text);
return input;
}
property: number = 3;
optionalProperty?: number;
get getter(): number {
return this.property;
}
set setter(value: number) {
throw new Error("Should not be called");
}
}
const sinonStubbedInstanceCreator = StubbedInstanceCreator<MyClass, SinonStub>(
() => sinon.stub()
);
const sinonMockMyClass = sinonStubbedInstanceCreator.createStubbedInstance();
const jestStubbedInstanceCreator = StubbedInstanceCreator<MyClass, jest.Mock>(
() => jest.fn()
);
const jestMockMyClass = jestStubbedInstanceCreator.createStubbedInstance();
Caveats, Known Issues, and Limitations
Due to the lazy nature of the stubbing, for properties to exist in the stub, they must be overridden or set with a value.
class MyClass {
property: number = 3;
get getter(): number {
return this.property;
}
set setter(value: number) {
throw new Error("Should not be called");
}
}
it("should have own property given property is overridden", () => {
const mockMyClass = StubbedInstanceCreator<MyClass, jest.Mock>(() =>
jest.fn()
).createStubbedInstance({ property: 5 }); // this test will fail if property is not overridden
expect((<MyClass>mockMyClass).hasOwnProperty("property")).toBe(true);
});
it("should have own property given property is set", () => {
const mockMyClass = StubbedInstanceCreator<MyClass, jest.Mock>(() =>
jest.fn()
).createStubbedInstance();
mockMyClass.property = 8; // this test will fail if property is not set
expect((<MyClass>mockMyClass).hasOwnProperty("property")).toBe(true);
});
Testing
- Set up the repo -
yarn
- Build the project -
npm run build
- Running Jest tests -
npm run test
- Running Cypress tests -
npm run cy:run
License
This project is licensed under the MIT License - see the LICENSE.md file for details