Mocking

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

src/widgets/Action.tsx

  1. import { create, tsx } from '@dojo/framework/core/vdom';
  2. import Button from '@dojo/widgets/button';
  3. import * as css from './Action.m.css';
  4. const factory = create().properties<{ fetchItems: () => void }>();
  5. const Action = factory(function Action({ properties }) {
  6. return (
  7. <div classes={[css.root]}>
  8. <Button key="button" onClick={() => properties().fetchItems()}>
  9. Fetch
  10. </Button>
  11. </div>
  12. );
  13. });
  14. export default Action;

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

tests/unit/widgets/Action.tsx

  1. const { describe, it } = intern.getInterface('bdd');
  2. import { tsx } from '@dojo/framework/core/vdom';
  3. import assertionTemplate from '@dojo/framework/testing/assertionTemplate';
  4. import harness from '@dojo/framework/testing/harness';
  5. import Action from '../../../src/widgets/Action';
  6. import * as css from '../../../src/widgets/Action.m.css';
  7. import Button from '@dojo/widgets/button';
  8. import { stub } from 'sinon';
  9. import { assert } from 'chai';
  10. describe('Action', () => {
  11. const fetchItems = stub();
  12. it('can fetch data on button click', () => {
  13. const h = harness(() => <Action fetchItems={fetchItems} />);
  14. h.expect(() => (
  15. <div classes={[css.root]}>
  16. <Button key="button" onClick={() => {}}>
  17. Fetch
  18. </Button>
  19. </div>
  20. ));
  21. h.trigger('@button', 'onClick');
  22. assert.isTrue(fetchItems.calledOnce);
  23. });
  24. });

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

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