better async assertions for Jasmine

We commonly test that some event (eg prop change or click) causes UI to change. Writing async js tests for this is not great.

currently:

it('updates value when prop changes', (done) => {
  vm.updatedProp = true;

  expect(vm.$el.innerText).toEqual('Loading');

  Vue.nextTick(() => {  // wait for vm to update
    setTimeout(() => {  // make test pass most of the time  ¯\_(ツ)_/¯
      expect(vm.$el.innerText).toEqual('Loaded');

      done();
    });
  });
});

proposal:

it('updates value when prop changes', () => {
  vm.updatedProp = true;

  expect(vm.$el.innerText).toEqual('Loading');
  expect(vm.$el.innerText).eventually.toEqual('Loaded');
});

Not sure if actually possible without done, but something like that is much simpler, and less error prone (e.g. when there are actual timeouts). Syntax is shameless inspired by chai-as-promised

alternatively: if test returns a promise, it is async. I think Jest and Ava do this

Edited by Simon Knox