开玩笑测试是否已调用矩函数,并且返回的输出是否正确

时间:2019-02-22 08:42:50

标签: javascript reactjs unit-testing jestjs enzyme

我有一个矩函数,用于格式化从服务器获取的日期(以毫秒为单位)。我正在尝试使用Enzyme和Jest进行测试,是否已调用moment function(1),并且所调用函数的输出是否是预期的。

这是我的组成部分:

/* eslint-disable react/default-props-match-prop-types */
import React, { Fragment } from 'react';
import moment from 'moment';
import ILicense from 'user/dto/ILicense';

export interface Props {
  license?: ILicense;
}

const LicenseInfo = <T extends object>({ license }: Props & T): JSX.Element => (
  <Fragment>
        <table className="table col-6 my-5">
          <tbody>
            <tr>
              <td>Valid Until:</td>
              <td className="font-weight-bold" id="expiry">
                {moment(expiredAt).format('YYYY-MM-DD HH:mm:ssZZ')}
              </td>
            </tr>
          </tbody>
        </table>
      </Fragment>
);

ComponentMoment.defaultProps = {
  expiredAt: null,
};

export default ComponentMoment;

这是我的测试:

  it('expect to show the expiration date if expiredAt is provided', () => {
    const moment = jest.mock('moment', () => () => ({ format: () => '2019–02–28T23:59:58' }));

    const license = {
      expiredAt: 1551391198000,
    };
    const wrapper = mount<ComponentMoment>(<ComponentMoment license={license}>Test</ComponentMoment>);
    wrapper.instance();
    expect(moment).toHaveBeenCalled();
  });

该测试当前失败:

MatchError: Value must be a mock or a spy, and a huge object with various jest functions.

对于第二项测试,请测试实际时间,我得到的是数字而不是字符串,并且toString无法正常工作。

我还读了这篇有关瞬间测试https://medium.com/front-end-weekly/mocking-moment-js-in-jest-a-simple-one-line-solution-61259ffaaa2的文章,但我真的不明白。

有人可以帮忙吗?我是测试的新手..我感到非常沮丧,因为我不知道原因,为什么它失败了。谢谢!!

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的那样,我相信您希望使用jest.fn()创建格式,然后将其附加到力矩对象上。

https://jestjs.io/docs/en/expect.html#tohavebeencalled