当前位置: 首页 > 面试题库 >

如何使用Redux Saga测试API请求失败?

魏冷勋
2023-03-14
问题内容

我正在尝试测试我的传奇可能遵循的每种情况,但是我无法使我想要的行为发生。这很简单,我有一个HTTP请求(登录),并且我想通过模拟我的API方法来测试成功和失败的情况。

但是,看起来好像call effect并没有触发我的api函数,我还没有真正了解它的工作原理,但是我猜中间件负责调用该函数,并且由于我不去浏览商店我的测试,我无法得到结果。

所以我的问题是,当您需要在异步调用旁边分派不同的动作(通常是成功或失败)时,如何测试您的传奇?

我找了一个例子,我发现成功和失败都是成功的原因,但是失败案例从未经过测试,例如在这里的购物车示例中

萨加

export function* login(action) {
  try {
    const user = yield call(api.login, action);
    return yield put(actions.loginSuccess(user));
  } catch(e) {
    yield put(actions.loginFail(e));
  }
}

export default function* rootAuthenticationSagas() {
  yield* takeLatest(LOGIN, login);
}

测试库

describe('login', () => {
  context('When it fails', () => {
    before('Stub the api', () => {
      sinon.stub(api, 'login', () => {
        // IT NEVER COMES HERE !
        return Promise.reject({ error: 'user not found' });
      });
    });

    it('should return a LOGIN_FAIL action', () => {
      const action = {
        payload: {
          name: 'toto',
          password: '123456'
        }
      };
      const generator = login(action);

      // THE CALL YIELD
      generator.next();

      const expectedResult = put({ type: 'LOGIN_FAIL', payload: { error: 'user not found' } });
      expect(generator.next().value).to.be.eql(expectedResult); // FAIL BECAUSE I GET A LOGIN_SUCCESS INSTEAD OF A FAIL ONE
    });
  });
});

问题答案:

马克的答案是正确的。中间件执行这些指令。但这使您的工作变得更轻松:在测试中,您可以提供所需的
任何内容
作为参数next(),生成器函数将作为的结果来接收它yield。这正是传奇中间件所做的事情(除了它实际上会触发一个请求而不是给您一个虚假的响应)。

yield获取任意值,请将其传递给next()。要使其“接收”错误,请将其传递给throw()。在您的示例中:

it('should return a LOGIN_FAIL action', () => {
  const action = {
    payload: {
      name: 'toto',
      password: '123456'
    }
  };
  const generator = login(action);

  // Check that Saga asks to call the API
  expect(
    generator.next().value
  ).to.be.eql(
    call(api.login, action)
  );

  // Note that *no actual request was made*!
  // We are just checking that the sequence of effects matches our expectations.

  // Check that Saga reacts correctly to the failure
  expect(
    generator.throw({
      error: 'user not found'
    }).value
  ).to.be.eql(
    put({
      type: 'LOGIN_FAIL',
      payload: { error: 'user not found' }
    })
  );
});


 类似资料:
  • 这一条给出: 这个: 我想做的是避免为所有测试编写完整的jsons,如果我可以跳过所有“”和{},将会更快。我的方法正确吗?

  • wikisearch.spec.ts 接下来,我们订阅来自我们后端的任何传入连接。这使我们可以访问一个对象 ,它允许我们配置我们想要从我们的后端发送的响应,以及测试任何来自我们正在测试的服务的请求。 在我们的示例中,我们要验证SearchWiki的搜索方法是否向正确的URL发出GET请求。这是通过查看当我们的服务连接到我们的模拟后端时获得的请求对象来完成。分析request.url属性,我们可以看

  • 问题内容: 我正在使用Passport.js进行身份验证(本地策略),并通过Mocha和Supertest进行测试。 如何使用Supertest创建会话并发出经过身份验证的请求? 问题答案: 您应该为此使用超级代理。它是较低级别的模块,由。看一看持久代理: 现在,您可以用来发出经过身份验证的请求。

  • 问题内容: 在我的JMeter测试中,如果有任何错误,我想触发HTTP请求以在系统上发布消息,以进一步关注。我在这里可以做什么?邮件可视化工具可以很好地通过电子邮件报告错误。我想做同样的事情,但是要通过HTTP请求。我正在使用jmeter 3.2。 问题答案: 您可以执行以下操作: 在HTTP Request采样器之后添加If Controller,并将以下代码放入“条件”区域: 将SMTP Sa

  • 我试图找到使用httr包通过R连接Appannie的API的方法(根本没有API连接的经验)。API要求包含来自appannie网站的请求标题引用:注册App Annie帐户并生成API密钥。将此密钥添加到您的请求标头中,如下所示: 授权:持有人“”引用 我写了这样的代码 命令http_status(getdata)显示我"客户端错误:(401)未经授权"有人能帮我吗,我做错了什么?

  • 我最近编写了一个具有一些Internet连接的应用程序。所有进程在模拟器中运行良好,但在Android Studio上,它会抛出一个,并带有以下堆栈跟踪。 快速的网络搜索表明,这个问题可能与回复标题有关,但我不确定为什么/如何防止这个错误。