Генератор не перехватывает ошибку от вызова API - PullRequest
0 голосов
/ 30 мая 2019

Я работаю с API, который не возвращает ничего «ошибочного» при неправильном входе в систему (просто обычный объект с кодом - incorrect_password или invalid_username - сообщение HTML), поэтому в своей функции вызова API я превращаю код в ошибку:

export async function loginWithApi(creds) {
  try {
    const res = await axios.get(ApiUrls.login, { params: creds });
    if (res.data.data) {
      return res.data;
    } else if (res.data.code) {
      throw Error(res.data.code.titleize());
    } // else, it should be an actual error
  } catch (err) {
    return err;
  }
}

Это работает правильно, правильно выдает, возвращает ошибку, когда это необходимо.

Однако, при тестировании моего сагогенератора, который вызывает эту функцию, ошибка не перехватывается, она не проходит через блок try:

функция

export function* loginSaga({ username, password }) {
  const creds = { username, password };
  try {
    const res = yield call(loginWithApi, creds);
    console.log(res);
    yield put({ type: "LOGIN_SUCCESS", user: res.data });
  } catch (error) {
    yield put({ type: "LOGIN_FAILURE", error });
  }
}

Тесты

 describe("login action", () => {
    let gen;
    afterEach(() => {
      expect(gen.next().done).toBe(true);
    });

    it("should return a user object on a successful login", () => {
      gen = loginSaga(success.creds);
      gen.next(); // call api
      expect(gen.next(mockResponse.success).value).toEqual(
        put({ type: "LOGIN_SUCCESS", user: mockResponse.success.data })
      );
    });

    it("should return an error when passed an invalid username", () => {
      gen = loginSaga(badUser.creds);
      gen.next(); // call api
      // mockReponse.usernameError: Error("Invalid Username")
      expect(gen.next(mockResponse.usernameError).value).toEqual(
        put({ type: "LOGIN_FAILURE", error: "Invalid Username" })
      );
    });

    it("should return an error when passed an invalid password", () => {
      gen = loginSaga(badPw.creds);
      gen.next(); // call api
      // mockResponse.passwordError: Error("Incorrect Password"),
      expect(gen.next(mockResponse.passwordError).value).toEqual(
        put({ type: "LOGIN_FAILURE", error: "Incorrect Password" })
      );
    });
  });

тестовый вывод (выдержки)

  ● Saga Actions › login action › should return an error when passed an invalid username

    expect(received).toEqual(expected) // deep equality

    - Expected
    + Received

      Object {
        "@@redux-saga/IO": true,
        "combinator": false,
        "payload": Object {
          "action": Object {
    -       "error": "Invalid Username",
    -       "type": "LOGIN_FAILURE",
    +       "type": "LOGIN_SUCCESS",
    +       "user": undefined,
          },
          "channel": undefined,
        },
        "type": "PUT",

● Saga Actions › login action › should return an error when passed an invalid password

    expect(received).toEqual(expected) // deep equality

    - Expected
    + Received

      Object {
        "@@redux-saga/IO": true,
        "combinator": false,
        "payload": Object {
          "action": Object {
    -       "error": "Incorrect Password",
    -       "type": "LOGIN_FAILURE",
    +       "type": "LOGIN_SUCCESS",
    +       "user": undefined,
          },
          "channel": undefined,
        },
        "type": "PUT",
      }

Регистрация подтверждает, что loginSaga функция имеет значение , получая Error во вторых двух тестах. Я не могу точно определить, почему эта ошибка не обнаруживается.

1 Ответ

1 голос
/ 30 мая 2019

Наконец-то понял.

Так что вам нужно заставить генератор думать, что исключение произошло для одного из yield. Для этого у нас есть generator.prototype.throw().

Итак, следующий код должен работать как положено:

it("should return an error when passed an invalid username", () => {
  gen = loginSaga(badUser.creds);
  gen.next(); // call api
  // mockReponse.usernameError: Error("Invalid Username")
  expect(gen.throw(mockResponse.usernameError).value).toEqual(
    put({ type: "LOGIN_FAILURE", error: "Invalid Username" })
  );
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...