首页 > 解决方案 > 使用 Redux Saga 操作正确测试 Auth 流程

问题描述

我只是在使用简单的旧 Jest 来测试我的新 Saga 动作。经过一番挣扎后,我了解到,与其嘲笑响应,不如将我的响应包含在对生成器的下一次调用中。以下函数的以下测试通过:

功能

import { put, call, takeEvery } from "redux-saga/effects";

export function* loginSaga({ username, password }) {
  const creds = { username, password };
  try {
    let data = yield call(() => axios.get(ApiUrls.login, { params: creds }));
    yield put({ type: "LOGIN_SUCCESS", user: data });
  } catch (error) {
    yield put({ type: "LOGIN_FAILURE", error });
  }
}

测试

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

但是等一下!测试根本不考虑凭据!无论我使用什么凭据调用,我的测试都通过了loginSaga(),因为它实际上并没有进行 API 调用,甚至是模拟调用!

我已经设置了这些对象来提供我对fetchMockor的调用axios-mock-adapter

success = {
  url: ApiUrls.Login + "?username=testuser1&password=123123",
  creds: { username: "testuser1", password: "123123" }
};
badUser = {
  url: success.url.replace("testuser", "xxx"),
  creds: { username: "xxx", password: "123123" }
};
badPw = {
  url: success.url + "0",
  creds: { username: "testuser1", password: "1231230" }
};

但是这种测试方法不使用它们!

我应该如何真正使这个测试有效?

标签: unit-testingredux-saga

解决方案


推荐阅读