【问题标题】:How to use Jest to test React rendered async data?如何使用 Jest 测试 React 渲染的异步数据?
【发布时间】:2016-09-15 14:16:23
【问题描述】:

我使用 React 进行渲染,使用 Jest/Jasmine 进行测试。我已经使用旧的 Jest/Jasmine waitsForruns 编写了测试,但这些现在在 Jasmine 2 中消失了,我不确定如何用新的 done asyncs 替换。

在我的代码中,React 呈现了一个关于用户的小页面。该页面有一个 AJAX 调用来获取用户帖子。我想测试用户帖子是否很好地返回,waitsFor 非常非常擅长:等到用户有一些帖子,然后继续。

我在网上看到很多人谈论在 Jest 测试中使用 AJAX 调用,这不是我想要的。我的 Jest 测试不知道是否进行了 AJAX 调用,因此我需要一种方法来等到结果返回。

这是我当前的代码,waitsForruns

it('loads user post', () => {
    var page = TestUtils.renderIntoDocument(
        <UserPage params={{user: 'fizzbuzz', 'pass': 'xxx'}} />
    );

    waitsFor(() => {
        return page.state.posts.length > 0;
    }, "post loaded", 10000);

    runs(() => {
        var posts = TestUtils.scryRenderedDOMComponentsWithClass(page, 'post');
        expect(posts.length).toEqual(10);
    });
});

如何删除 waitsForruns 并替换为有效的 Jasmine 2.0 代码?所有 Jest 测试都知道 page.state.posts.lengthexpect 之前必须大于 0。

【问题讨论】:

    标签: ajax reactjs jasmine jestjs


    【解决方案1】:

    您应该将此测试重构为两个单元测试,以便对您的代码进行更严格的测试。这将使测试更加独立,并有助于在更精细的范围内识别错误。这些并不准确,因为我不知道您的代码是什么样的,但这是我希望看到的内容:-

    it('generates the expected properties for a page', function () {
        var page = TestUtils.renderIntoDocument(
            <UserPage params={{user: 'fizzbuzz', 'pass': 'xxx'}} />
        );
    
        expect(page.someProperty).toBeDefined();
        expect(page.user).toEqual('fizzbuzz');
    });
    
    it('generates the correct number of posts from a given page object', function () {
        var fakePage = {
            // put your fake mock data here that TestUtils expects
        };
    
        var posts = TestUtils.scryRenderedDOMComponentsWithClass(fakePage, 'post');
    
        expect(posts.length).toEqual(10);
    });
    

    我不太确定您的 renderIntoDocument 函数中发生了什么,因此顶部测试可能有点损坏...看起来函数内部发生了太多事情,或者您需要测试调用该功能正在代替。如果您详细说明它的作用,我将编辑答案。

    【讨论】:

    • 对不起,我的回归缓慢!谢谢!我添加了一个赞成票,因为我认为您的方向是正确的。 renderIntoDocument 不是我自己的代码,而是来自 React 的代码。它呈现我的 React 组件,就好像它们是真实制作的一样。在 React 中渲染会导致 Ajax 发生,我试图确保 Ajax 正常完成。这在旧的 Jasmine 中是可能的,因为 Ajax 可以在渲染的 React 组件内完成,我在测试中检查了它的值。但目前在 Jasmine 2 中是不可能的。
    • @FizzBu​​zz 不用担心 - 感谢您回复我!我明白了,目前显然对 React 有点摸不着头脑。如果它是一个原生的 React 函数,我建议不要测试这个逻辑,因为它应该已经被编写该函数的开发人员(即 React 作者)测试过——坚持在这个函数之外(之前和之后)测试你自己的逻辑,而不是直接测试它们的功能。这就是我无论如何都会推荐的。抱歉,如果我误解了 - 就像我说的,还没有接触到 React。
    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2018-07-19
    • 2019-10-30
    • 2018-03-24
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多