ts+react, 用mocha测试setInterval,

为君一笑 提交于 2020-01-17 13:54:56

Question

如何用mocha测试setInterval,

在代码中,将setInterval和clearInterval放在一个函数中,并且用一个公共属性public或private属性来赋值,测试的时候会报错

 

原因

mocha测试主要是node环境,所以找不到windows对象下的时间

解决方案

先修改开发代码

用组件state来赋值,将setInterval单独放入一个函数,clearInterval单独放入一个函数

  /**

   * #### Starts the timer and update the component's state

   * @param autoRefreshTimeS is equal component's state interval (s)

   * *****

   * ### Attention:

   * this is asynchronous operations

   */

  private startTimer(autoRefreshTimeS: number) {

    this.state.logger.debug("Starting timer with interval", autoRefreshTimeS);

    let second = 0;

    const timer = setInterval(async () => {

      this.state.logger.debug(

        "Timer fires. Sending a new image fetching request.",

      );

      second++;

      // if time is equal to interval,fetch image

      if (second % autoRefreshTimeS === 0) {

        this.props.fetchData();

      }
    //这里为什么不能直接写timer,而写1000呢?
//因为用户会随时更改timer,写timer易导致不停刷新,浏览器奔溃
    }, 1000);

    this.setState({ timer });

  }


  /**

   * #### Stops the timer and updates the component's state

   * *****

   * ### Attention:

   * this is asynchronous operations

   */

  private stopTimer() {

    this.state.logger.debug("Stopping timer");

    if (this.state.timer !== null) {

      clearInterval(this.state.timer);

      this.setState({ timer: null });

    }

  }

 

 

测试部分

其实我可能写的不太对,但是目前这么写能够测到 

// test Timer API

  describe("test state about 'timer' ", () => {

    let galleries;

    before(() => {

//这是你的组件

      galleries = enzyme.shallow(

        <Gallery

          loggerFactory={loggers}

          translator={translators.object}

          imageProvider={imageInfoProviderMocks.object}

          cache={cacheMocks.object}

          filterProvider={filterProviderMocks.object}

          generatorUrl={imagePathProviderMocks.object}

        />,

      );

    });

    it("select interval value, gallery state about interval 
will update,gallery will have 'timer' api, toggle autoRefresh 
to make it as false, 'timer' is null", async () => {

//下面这句是触发条件

      // select interval value, gallery will update state about interval and timer

      galleries.find(TopOption).prop("updateIntervalAndTimer")(1);

//下面这句是当timer触发后引起的结果

      expect(galleries.state("interval")).to.equal(1);

//又一个触发条件

      galleries.setState({ autoRefresh: true, interval: 2000 });

//触发后引起的结果

      expect(galleries.state("timer")).not.equal(null, "");

//下面这两句是单纯为了覆盖率,暂时不晓得为什么要这么写

      galleries.state("timer")._onTimeout();

      expect(galleries.state("timer")._repeat).equal(1000);

//不能让timer保持触发状态,所以下面这句是为了关闭Timer

      galleries.find(TopOption).prop("updateAutoRefreshAndTimer")(false);

    });

  });

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!