javascript - 如何用 jest 测试 rxjs ajax 调用?

标签 javascript rxjs jestjs rxjs6

我有一个容器组件,我通过 ajax 运算符从 rxjs 获取数据

const data = ajax(someUrl).pipe(map(r => r.response));

在我的 componentDidMount 中我有

data.subscribe((data) => {
    this.setState({ data });
});

//测试.js

import React from 'react';
import { mount } from 'enzyme';
import { ajax } from 'rxjs/ajax'
import App from '../src/App';

describe('<App />', () => {
  const wrap = mount(<App />);
  const data = [{ 1: 'a' }];
  const mock = ajax('http://url.com').pipe(map(() => data));
  it('renders', () => {
    console.log(mock.subscribe(x => x));
    expect(wrap.find(App).exists()).toBe(true);
  });
});

如何模拟响应,以便在运行测试时可以将该数据传递给其他组件并检查它们是否呈现?

我发现的所有测试示例都是 redux-Observable 的,但我没有使用。

非常感谢!

最佳答案

首先,您需要了解您应该一次测试一件事。 这意味着测试异步方法执行应该与测试呈现正确内容的组件分开。

要测试异步方法,您可以模拟数据,然后在 Jest 中模拟计时器。

https://jestjs.io/docs/en/tutorial-async

https://jestjs.io/docs/en/asynchronous

https://jestjs.io/docs/en/timer-mocks.html

使用jest.useFakeTimers()和上面提到的技术。

要测试组件正确渲染,请使用 jest snapshots 和 e2e 测试(可以使用 ex. TestCafe 完成)

要连接这些方法,您需要以允许您执行以下操作的方式设计应用程序:

  1. 您在组件中调用的 API 应该位于组件外部,并从该外部源调用(不同的文件、不同的类,无论您如何设计),因此您可以在测试中替换它。

  2. 整个 API 应该是模块化的,因此您可以采用一个模块并对其进行测试,而无需仅针对这种情况初始化整个 API。

  3. 如果您以这种方式设计您的应用程序,您可以使用模拟数据初始化部分 API,然后在测试中渲染您的组件,因为它将调用模拟 API,您可以检查它是否呈现您期望的内容到。

关于javascript - 如何用 jest 测试 rxjs ajax 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558226/

相关文章:

javascript - jquery mobile 如何在 HTML 中注入(inject)类?

javascript - 通过 AJAX 加载 SPA 网页

javascript - 如何检查输入文本字段是否只包含空格?

Angular 2 - 绑定(bind)与订阅

reactjs - 如何使用 Jest 和 enzyme 来模拟导入的 React 高阶组件?

javascript - 取消绑定(bind)某些类上的点击处理程序

javascript - 在 Angular 中链接可观察订阅的最佳方式?

Angular Testing - ngBootstraps typeahead

javascript - 不能在/node_modules 中的模块外使用 import 语句

javascript - TypeScript ts-jest 预处理器的目的是什么?