在Ember.js中如何断言运行循环?

时间:2016-02-14 15:25:19

标签: javascript unit-testing ember.js mocking stubbing

我在Ember服务中有这个代码:

run

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

我想到的事情,我不想诉诸:

  • 我可以使用run代替const { run } = Ember;并使用存根和恢复,但我喜欢解析文件顶部的全局变量(@media screen and (min-width: 480px) { body { background-color: lightgreen; } } ),所以我不想牺牲那只是为了测试。
  • 我可以在另一个Ember服务中包装run loop调用,这样我就可以将其存根,但这看起来有些过分。

基本上我想知道在输入运行循环时是否有任何事件会触发,我可以在测试中听到。如果涉及Ember私有,那没关系。

2 个答案:

答案 0 :(得分:0)

您可以在方法中添加参数,这会使您的服务方法更“可测试”。分析这段代码:

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);

哪个输出:

  

原始方法

     

替换方法

这是demo

最终你可以使用:

  

我可以在另一个Ember服务中包装run loop调用,这样我就可以存根   它,但这似乎有点矫枉过正。

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

答案 1 :(得分:0)

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

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