【问题标题】:Date object value is changes -- JavaScript日期对象值发生变化——JavaScript
【发布时间】:2016-01-28 05:00:59
【问题描述】:

我正在对接收日期作为变量的组件进行单元测试。我的测试失败了,因为实际和预期对象中的 ate 变量不断向日期值添加几毫秒。

describe('Clock',()=>{
    it('works',()=>{
        let renderer = createRenderer();
        let date = new Date();


        renderer.render(<Clock time={ date}> </Clock>);
        let actualElement = renderer.getRenderOutput();

        let expectedElement = <FormattedTime value={date} hour="numeric" minute="numeric" second="numeric" />;

        expect(actualElement).toEqual(expectedElement);
    });
});

当我运行我的测试时。在上面,它显示了expectedElement date 增加了几毫秒。

-    "value": [Date: 2016-01-28T04:48:57.000Z]
+    "value": [Date: 2016-01-28T04:48:57.893Z]

请问我如何计算日期?或者更好地摆脱毫秒。我尝试了很多选项,例如

let date = Math.floor(new Date().getTime()/1000);
let rTime = new Date(date * 1000);

renderer.render(<Clock time={ rTime}> </Clock>);
let actualElement = renderer.getRenderOutput();

let expectedElement = <FormattedTime value={rTime} hour="numeric" minute="numeric" second="numeric" />;

任何帮助将不胜感激。

更新 你好,下面是我要求的时钟。 导出默认类 Clock 扩展 React.Component {

    constructor(props) {
        super(props);

        this.state = {
            time: new Date(),
        };
    }

    componentDidMount() {
        this.interval = setInterval(() => this.setState({ time: new Date() }), 1000);
    }

    componentWillUnmount() {
        clearInterval(this.interval);
    }

    render() {
        const { time } = this.state;
        return (
            <FormattedTime value={time} hour="numeric" minute="numeric" second="numeric" />
        );
    }
}

我使用下面建议的date.setMilliseconds(0),然后我意识到时钟组件返回 0。所以我不得不将我的测试更改为下面的测试。

describe('Clock',()=>{
    it('works',()=>{
        let renderer = createRenderer();
        let date = new Date();
        date.setMilliseconds(0)

        renderer.render(<Clock time={ date}> </Clock>);
        let actualElement = renderer.getRenderOutput();
        let expectedElement = <FormattedTime value={date} hour="numeric" minute="numeric" second="numeric" />;
        actualElement.props.value.setMilliseconds(0);
        expect(actualElement).toEqual(expectedElement);
    });
});

现在它的工作。感谢您的时间。顺便说一句,我正在运行并使用 reacjs 和 react-addons-test-utils lib 进行测试。

【问题讨论】:

  • 请告诉我们负责渲染的代码,例如ClockFormattedTimerenderer
  • 你在什么环境下运行这个?
  • date.setMilliseconds(0) 就足够了;但没有摆脱毫秒工作?
  • @Bergi 现在可以使用了。感谢您的宝贵时间。

标签: javascript unit-testing date reactjs


【解决方案1】:

要摆脱毫秒,只需将它们设置为零:'date.setMilliseconds (0)'

MDN reference

【讨论】:

  • 这将一直有效,直到以毫秒为单位的差异大于 1 秒。更好地找出为什么存在差异(OP没有提供足够的信息)。
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多