I have two functions and one of them calls another function
<code>// calculator.ts
export function add(a: number, b: number): number {
if (typeof a !== 'number' || isNaN(a) || typeof b !== 'number' || isNaN(b)) {
throw new TypeError('Both arguments must be numbers');
}
return a + b;
}
export function subtract(a: number, b: number): number {
return add(a, -b);
}
</code>
<code>// calculator.ts
export function add(a: number, b: number): number {
if (typeof a !== 'number' || isNaN(a) || typeof b !== 'number' || isNaN(b)) {
throw new TypeError('Both arguments must be numbers');
}
return a + b;
}
export function subtract(a: number, b: number): number {
return add(a, -b);
}
</code>
// calculator.ts
export function add(a: number, b: number): number {
if (typeof a !== 'number' || isNaN(a) || typeof b !== 'number' || isNaN(b)) {
throw new TypeError('Both arguments must be numbers');
}
return a + b;
}
export function subtract(a: number, b: number): number {
return add(a, -b);
}
I have mocked the add
function using spy on
<code>// calculator.spec.ts
describe('subtract(number, number)', () => {
let addMock: jest.SpyInstance;
beforeEach(() => {
addMock = jest.spyOn(calculator, 'add').mockImplementation((a, b) => a + b);
});
afterEach(() => {
addMock.mockRestore();
});
it.each([
['a', 1],
[1, 'b'],
['a', 'b'],
])('should throw TypeError when `%s` and `%s` are subtracted', (a: any, b: any) => {
expect(() => calculator.subtract(a, b)).toThrow(TypeError);
expect(addMock).not.toHaveBeenCalled();
});
it.each([
[5, 3, 2],
[-1, -1, 0],
[1.5, 0.5, 1],
])('should subtract `%d` and `%d` to yield `%d`', (a, b, expected) => {
expect(calculator.subtract(a, b)).toBe(expected);
expect(calculator.add).toHaveBeenCalledWith(a, -b);
});
});
</code>
<code>// calculator.spec.ts
describe('subtract(number, number)', () => {
let addMock: jest.SpyInstance;
beforeEach(() => {
addMock = jest.spyOn(calculator, 'add').mockImplementation((a, b) => a + b);
});
afterEach(() => {
addMock.mockRestore();
});
it.each([
['a', 1],
[1, 'b'],
['a', 'b'],
])('should throw TypeError when `%s` and `%s` are subtracted', (a: any, b: any) => {
expect(() => calculator.subtract(a, b)).toThrow(TypeError);
expect(addMock).not.toHaveBeenCalled();
});
it.each([
[5, 3, 2],
[-1, -1, 0],
[1.5, 0.5, 1],
])('should subtract `%d` and `%d` to yield `%d`', (a, b, expected) => {
expect(calculator.subtract(a, b)).toBe(expected);
expect(calculator.add).toHaveBeenCalledWith(a, -b);
});
});
</code>
// calculator.spec.ts
describe('subtract(number, number)', () => {
let addMock: jest.SpyInstance;
beforeEach(() => {
addMock = jest.spyOn(calculator, 'add').mockImplementation((a, b) => a + b);
});
afterEach(() => {
addMock.mockRestore();
});
it.each([
['a', 1],
[1, 'b'],
['a', 'b'],
])('should throw TypeError when `%s` and `%s` are subtracted', (a: any, b: any) => {
expect(() => calculator.subtract(a, b)).toThrow(TypeError);
expect(addMock).not.toHaveBeenCalled();
});
it.each([
[5, 3, 2],
[-1, -1, 0],
[1.5, 0.5, 1],
])('should subtract `%d` and `%d` to yield `%d`', (a, b, expected) => {
expect(calculator.subtract(a, b)).toBe(expected);
expect(calculator.add).toHaveBeenCalledWith(a, -b);
});
});
For some reasons (idk) expect(calculator.add).toHaveBeenCalledWith(a, -b);
is not working. I am getting
<code> Expected: 1.5, -0.5
Number of calls: 0
48 | ])('should subtract `%d` and `%d` to yield `%d`', (a, b, expected) => {
49 | expect(calculator.subtract(a, b)).toBe(expected);
> 50 | expect(calculator.add).toHaveBeenCalledWith(a, -b);
| ^
51 | });
52 | });
53 |
</code>
<code> Expected: 1.5, -0.5
Number of calls: 0
48 | ])('should subtract `%d` and `%d` to yield `%d`', (a, b, expected) => {
49 | expect(calculator.subtract(a, b)).toBe(expected);
> 50 | expect(calculator.add).toHaveBeenCalledWith(a, -b);
| ^
51 | });
52 | });
53 |
</code>
Expected: 1.5, -0.5
Number of calls: 0
48 | ])('should subtract `%d` and `%d` to yield `%d`', (a, b, expected) => {
49 | expect(calculator.subtract(a, b)).toBe(expected);
> 50 | expect(calculator.add).toHaveBeenCalledWith(a, -b);
| ^
51 | });
52 | });
53 |
I have also tried asserting with addMock
still same issue