Я хочу выдать ошибку в методе компонента, вызываемого из другого компонента, чем я тестирую
// Class1.js
class Class1 {
getData() {
return { data }
}
}
module.exports = new Class1()
// Class2.js
class1 = require('./Class1')
class Class2 {
getData() {
try {
let data = class1.getData()
return { data }
} catch (err) {
return err
}
}
}
module.exports = new Class2()
// Class2.spec.js
const class1 = require('./Class1')
const class2 = require('./Class2')
test("Test Class2 catch block", () => {
jest.spyOn(class1, 'getData').mockReturnValue(new Error("Error"))
expect(class2.getData()).toEqual(Error("Error"));
})
Но jest.spyOn не ловит и выдает новую ошибку. Что я делаю не так? Мне нужно проверить блок catch в Class2
извините .. Я не включил module.exports только для того, чтобы упростить вопрос
Вы не написали, в чем ошибка. Макет должен работать, за исключением того, что ваши ожидания неверны. Почему это должен быть экземпляр ошибки? Это будет работать как .mockReturnValue('foo)
и .toEqual({ data: 'foo' })
Я ожидаю, что spyOn вернет новый экземпляр Error при вызове getData.. но он возвращает только {data}, поэтому он не попадает в блок catch метода Class2.getData
Для блока catch сгенерируйте ошибку mockImplementation(() => throw Error('foo))
и перехватите ее expect(()=>class2.getData()).toThrow('foo')
. Также этот try..catch - это noop.
Модульное тестовое решение:
class1.js
:
class Class1 {
getData() {
return { data };
}
}
module.exports = new Class1();
class2.js
:
const class1 = require('./class1');
class Class2 {
getData() {
try {
let data = class1.getData();
return { data };
} catch (err) {
return err;
}
}
}
module.exports = new Class2();
class2.test.js
:
const class1 = require('./class1');
const class2 = require('./class2');
describe('65258975', () => {
afterEach(() => {
jest.restoreAllMocks();
});
test('Test Class2 catch block', () => {
const getDataSpy = jest.spyOn(class1, 'getData').mockImplementationOnce(() => {
throw new Error('Error');
});
const actual = class2.getData();
expect(actual).toBeInstanceOf(Error);
expect(actual.message).toEqual('Error');
expect(getDataSpy).toBeCalledTimes(1);
});
test('should pass', () => {
const getDataSpy = jest.spyOn(class1, 'getData').mockReturnValueOnce('teresa teng');
const actual = class2.getData();
expect(actual).toEqual({ data: 'teresa teng' });
expect(getDataSpy).toBeCalledTimes(1);
});
});
результат модульного теста:
PASS examples/65258975/class2.test.js
65258975
✓ Test Class2 catch block (3 ms)
✓ should pass
-----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------
All files | 87.5 | 100 | 50 | 87.5 |
class1.js | 50 | 100 | 0 | 50 | 3
class2.js | 100 | 100 | 100 | 100 |
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 5.976 s
исходный код: https://github.com/mrdulin/jest-v26-codelab/tree/main/examples/65258975
Пожалуйста, предоставьте stackoverflow.com/help/mcve, который может воспроизвести проблему. Вы используете getData как статический метод, но это метод экземпляра.