你如何断言在 Ember.js 中使用了运行循环

How do you assert a run loop was used in Ember.js?

本文关键字:js 循环 运行 Ember 何断言 断言      更新时间:2023-09-26

我在 Ember 服务中有以下代码:

return new Promise((resolve, reject) => {
  semaphore.take(() => {
    this.get('limiter').removeTokens(1, () => {
      semaphore.leave();
      this.get('requestSender').sendRequest(url).then(data => {
        run(null, resolve, cache.put(url, data, cacheTime));
      }).catch(function() {
        run(null, reject, arguments);
      });
    });
  });
});

正在经历限制器回调,所以我需要一个运行循环(据我所知(。我想在单元测试中断言使用了运行循环。我可以断言承诺从缓存中解析正确的值,但我不知道如何验证是否使用了运行循环。换句话说,我可以删除run调用,并且我的所有测试仍然会通过,这是不可取的。

我想到的事情我不想求助于:

  • 我可以使用Ember.run而不是run并使用存根和恢复,但我喜欢解构文件顶部的全局变量(const { run } = Ember;(,所以我不想仅仅为了测试而牺牲它。
  • 我可以将运行循环调用包装在另一个 Ember 服务中,以便我可以存根它,但这似乎有点矫枉过正。

基本上,我想知道在进入运行循环时是否有任何事件触发,我可以在测试中收听。如果涉及余烬私人也没关系。

您可以在方法中添加参数,这将使您的服务方法更"可测试"。分析以下代码片段:

const Ember = {
  run() {
    console.log('ORIGINAL METHOD');
  }
};
const { run } = Ember;
const service = {
  method(runMethod) {
    let runToCall = runMethod ? runMethod : run;
    runToCall();
  }
};
// in application
service.method();
// in tests
function mockedRun() {
  console.log('REPLACED METHOD');  
};
service.method(mockedRun);

哪些输出:

原始方法

替换的方法

这是演示。

最终,您可以使用:

我可以将运行循环调用包装在另一个 Ember 服务中,以便我可以存根它,但这似乎有点矫枉过正。

但似乎将函数作为参数传递更简单。

如果未启动运行循环,测试将失败,因为您将获得断言。这还不够吗?

为什么需要断言使用了运行循环?