dojo dragon main logo

Mocking

一种常见的测试类型是验证部件的用户界面是否按预期渲染,而不必关心部件的底层业务逻辑。但这些测试可能希望断言一些场景,如单击按钮以调用部件的属性方法,并不关心属性方法的实现逻辑,只是希望按预期调用了接口。在这种情况下,可借助类似 Sinon 的 mock 库。

src/widgets/Action.tsx

import { create, tsx } from '@dojo/framework/core/vdom';
import Button from '@dojo/widgets/button';

import * as css from './Action.m.css';

const factory = create().properties<{ fetchItems: () => void }>();

const Action = factory(function Action({ properties }) {
    return (
        <div classes={[css.root]}>
            <Button key="button" onClick={() => properties().fetchItems()}>
                Fetch
            </Button>
        </div>
    );
});

export default Action;

测试当单击按钮后,会调用 properties().fetchItems 方法。

tests/unit/widgets/Action.tsx

const { describe, it } = intern.getInterface('bdd');
import { tsx } from '@dojo/framework/core/vdom';
import assertionTemplate from '@dojo/framework/testing/assertionTemplate';
import harness from '@dojo/framework/testing/harness';

import Action from '../../../src/widgets/Action';
import * as css from '../../../src/widgets/Action.m.css';

import Button from '@dojo/widgets/button';

import { stub } from 'sinon';
import { assert } from 'chai';

describe('Action', () => {
    const fetchItems = stub();
    it('can fetch data on button click', () => {
        const h = harness(() => <Action fetchItems={fetchItems} />);
        h.expect(() => (
            <div classes={[css.root]}>
                <Button key="button" onClick={() => {}}>
                    Fetch
                </Button>
            </div>
        ));
        h.trigger('@button', 'onClick');
        assert.isTrue(fetchItems.calledOnce);
    });
});

在这种情况下,mock 一个 Action 部件的 fetchItems 方法,该方法用于获取数据项。然后使用 @button 定位到按钮,并触发按钮的 onClick 事件,然后校验 fetchItems 方法仅被调用过一次。

要了解更多 mocking 信息,请阅读 Sinon 文档。