'incrementProperty'是异步调用吗?

时间:2018-01-13 15:50:00

标签: ember.js

查看Ember tutorial on testing models,它将 incrementProperty 视为异步调用。为什么呢?

app / models / player.js

import Model from 'ember-data/model';
import { attr } from 'ember-data/model';

export default Model.extend({
  level: attr('number', { defaultValue: 0 }),
  levelName: attr('string', { defaultValue: 'Noob' }),

  levelUp() {
    let newLevel = this.incrementProperty('level');
    if (newLevel === 5) {
      this.set('levelName', 'Professional');
    }
  }
});

tests / unit / models / player-test.js

import { moduleForModel, test } from 'ember-qunit';
import { run } from "@ember/runloop";

moduleForModel('player', 'Unit | Model | player', {
  // Specify the other units that are required for this test.
  needs: []
});

test('should increment level when told to', function(assert) {
  // this.subject aliases the createRecord method on the model
  const player = this.subject({ level: 4 });

  // wrap asynchronous call in run loop
  run(() => player.levelUp());

  assert.equal(player.get('level'), 5, 'level gets incremented');
  assert.equal(player.get('levelName'), 'Professional', 'new level is called professional');
});

据我所知,code似乎是同步的,但是从测试中删除运行循环会产生错误并且测试失败:

  

错误:断言失败:您已打开测试模式,即   禁用了运行循环的自动运行。你将需要包装任何代码   运行中的异步副作用

1 个答案:

答案 0 :(得分:0)

引用Run Loop guides,对操作进行批处理以优化渲染:

  

Ember的内部结构以及您将在应用程序中编写的大部分代码都在运行循环中进行。运行循环用于批处理,并以最有效和最有效的方式排序(或重新排序)工作。

     

为什么运行循环有用?   通常,批处理类似的工作都有好处。 Web浏览器通过将更改批量化到DOM来执行非常类似的操作。

测试中发生的事情是runloop不会自动运行,因此您需要run来刷新队列。我相信正在进行的工作是消除测试环境的这种不同行为。