0.2.0 • Published 8 months ago
@asanovr/ts-sinon v0.2.0
@golevelup/ts-sinon
Motivation
With @golevelup/ts-sinon
's createMock
utility function, you can easily generate deeply nested mock objects for unit
testing, especially useful for mocking complex types like those found in NestJS.
Usage
This package is particularly handy when unit testing components in NestJS, but it's not limited to that. It can essentially mock any TypeScript interface!
Installation
npm i @golevelup/ts-sinon --save-dev
or
yarn add @golevelup/ts-sinon --dev
Creating Mocks
- Import the
createMock
function into your test class. - Create a variable and set it equal to the
createMock
function with its generic type input. - Use the mock, Luke.
Here's an example with NestJS' ExecutionContext
:
import { createMock } from '@golevelup/ts-sinon';
import { ExecutionContext } from '@nestjs/common';
describe('Mocked Execution Context', () => {
it('should have a fully mocked Execution Context', () => {
const mockExecutionContext = createMock<ExecutionContext>();
expect(mockExecutionContext.switchToHttp()).toBeDefined();
});
});
createMock
generates all sub-properties as sinon.stub()
, so you can chain method calls:
it('should correctly resolve mocked providers', async () => {
const request = {
key: 'val',
};
mockExecutionContext.switchToHttp.returns(
createMock<HttpArgumentsHost>({
getRequest: () => request,
})
);
const mockResult = mockExecutionContext.switchToHttp().getRequest();
expect(mockResult).toBe(request);
});
You can also easily provide your own mocks:
const mockExecutionContext = createMock<ExecutionContext>({
switchToHttp: () => ({
getRequest: () => ({
headers: {
authorization: 'auth',
},
}),
getResponse: sinon.stub().returns({ data: 'res return data' }),
}),
});
Note: When providing your own mocks, the number of times a parent mock function was called includes the times needed to set your mocks.
Contribute
Contributions welcome! Read the contribution guidelines first.
License
0.2.0
8 months ago