快照在CI服务器中显示时区名称而不是GMT代码

时间:2019-06-27 14:38:07

标签: javascript vue.js jest

我在项目中使用快照测试,并且在CI服务器上运行此特定测试时遇到一个奇怪的问题:它显示时区名称而不是GMT代码,从而导致测试失败。

我尝试使用“ moment-timezone”和Date.UTC()对日期进行归一化,显示的结果是正确的日期,并且存在与上述相同的问题。

我也曾尝试对 global.Date 对象进行存根处理,但是组件抱怨道具不兼容。

 it('should render with props', () => {
    const order = {
      merchant: { logo: 'abc', name: 'Pizza Hut' },
      bag: {
        items: [{ name: 'Corn & Bacon' }],
        total: {
          valueWithDiscount: 99.99,
        },
      },
      delivery: {
        deliversAt: new Date('2019-05-21 13:00'),
      },
      payment: {
        mode: 'online',
      },
      lastStatus: API_STATUSES.cancelled,
      createdAt: new Date('2019-05-21 12:00'),
      details: {},
    };
    const wrapper = shallowMount(Order, {
      ...commons,
      propsData: { order },
    });
    expect(wrapper).toMatchSnapshot();
  });

请确保预期日期与收到的日期相同,但是在语法上有所不同:

        <div class="order__details">
    -     <orderdetails-stub paymentmode="online" deliverytime="Fri Jun 21 2019 10:00:00 GMT-0300 (GMT-03:00)" value="99.99" laststatus="cancelled"></orderdetails-stub>
    +     <orderdetails-stub paymentmode="online" deliverytime="Fri Jun 21 2019 10:00:00 GMT-0300 (Brasilia Standard Time)" value="99.99" laststatus="cancelled"></orderdetails-stub>

1 个答案:

答案 0 :(得分:0)

将Date字符串用作此类道具非常危险,并且可能会导致您遇到的问题。

根据我的经验,测试的最佳实践是使用Date.getTime(),因此值是毫秒数,没有任何语言环境信息。

或者,您可以使用this article中所述的moment-timezone

import moment from 'moment-timezone';

it('renders without crashing', () => {
  moment.tz.setDefault('EST');
  let props = {
    currentDay: moment("2017-09-15 09:30:00").format("MMM Do YYYY h:mm:ss a")
  };

  const tree = renderer.create(<App {...props} />).toJSON();
  expect(tree).toMatchSnapshot();
});