Я проверил успешный ответ, но у меня проблемы с ошибочным ответом.
Вот действие:
export function* searchSaga({ searchParams }) {
try {
const { text, customers, searchField } = searchParams;
const results = customers.filter(c => c[searchField] === text);
yield put({
type: "CUSTOMER_SEARCH_SUCCESS",
results
});
} catch (error) {
yield put({
type: "CUSTOMER_SEARCH_FAILURE",
error
});
}
}
Тест на успешность пройден:
const initialAction = { type: "SEARCH_CUSTOMERS_START", searchParams };
it("searches customers with a saga", async () => {
const dispatched = await recordSaga(searchSaga, initialAction);
const expectedAction = {
type: "CUSTOMER_SEARCH_SUCCESS",
results: [customers[0]]
};
expect(dispatched).toContainEqual(expectedAction);
});
Однако, когда я пытаюсь проверить неудачу, выкидываю ошибкув моём издевательстве мешает:
it("returns an error on a failure", async () => {
const error = new Error("uh oh!");
Array.prototype.filter = jest.fn();
Array.prototype.filter.mockImplementation(() => throw error);
const dispatched = await recordSaga(searchSaga, initialAction);
const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
console.log(dispatched);
expect(dispatched).toContainEqual(expectedAction);
});
Вывод этого теста включает сгенерированную ошибку, однако консоль показывает, что было также отправлено правильное действие при сбое!
● Console
console.log __tests__/CustomerSearch.test.js:48
[ { type: 'CUSTOMER_SEARCH_FAILURE',
error:
Error: uh oh!
at _callee2$ (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/__tests__/CustomerSearch.test.js:43:19)
at tryCatch (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:45:40)
at Generator.invoke [as _invoke] (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:271:22)
at Generator.prototype.(anonymous function) [as next] (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:97:21)
at tryCatch (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:45:40)
at invoke (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:135:20)
at /Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:170:11
at tryCallTwo (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/promise/lib/core.js:45:5)
at doResolve (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/promise/lib/core.js:200:13)
at new Promise (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/promise/lib/core.js:66:3) } ]
● searchCustomers › returns an error on a failure
uh oh!
41 |
42 | it("returns an error on a failure", async () => {
> 43 | const error = new Error("uh oh!");
| ^
44 | Array.prototype.filter = jest.fn();
45 | Array.prototype.filter.mockImplementation(() => throw error);
46 | const dispatched = await recordSaga(searchSaga, initialAction);
СейчасЯ попытался обернуть это в блок try / catch:
it("returns an error on a failure", async () => {
const error = new Error("uh oh!");
Array.prototype.filter = jest.fn();
Array.prototype.filter.mockImplementation(() => throw error);
try {
const dispatched = await recordSaga(searchSaga, initialAction);
} catch (e) {
console.log(dispatched);
const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
expect(dispatched).toContainEqual(expectedAction);
}
});
И это действительно проходит, однако это ложный положительный результат.Если я, например, изменю тип ожидаемого действия на какую-то ерунду, тест все равно пройдет.
Как мне заставить это работать?
Редактировать: я заметил, что console.log(dispatched)
никогда не активировался в последнем проходящем примере.Я добавил копию этого оператора журнала в блок try
и вижу, что я am получает правильное возвращаемое действие сбоя.
Играя с журналированием, кажется, что ошибка выдается и обнаруживается в некоторых странных местах.
it("returns an error on a failure", async () => {
const error = new Error("uh oh!");
Array.prototype.filter = jest.fn();
Array.prototype.filter.mockImplementation(() => throw error);
const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
try {
const dispatched = await recordSaga(searchSaga, initialAction);
console.log("***DISPATCHED FROM TRY IN TEST***", dispatched);
expect(dispatched).toContainEqual(expectedAction);
} catch (e) {
console.log("***ERROR FROM CATCH IN TEST***", e);
}
});
Вышеприведенное записывает в журнал правильные отправленные действия из блока try, а затем регистрирует ошибку "ух-ой" из блока catch.Удаление последней строки блока try
записывает правильные действия из блока try, и все, оно проходит.Это проходит, конечно, потому что нет никаких утверждений, чтобы потерпеть неудачу.
Так что, похоже, это фактическое утверждение, которое выдает ошибку.Я не могу понять, когда выдается ошибка и как ее избежать.