3

我有一个执行异步操作的控制器,我想对其进行测试:

/*globals Ember, momnent*/
import { raw as icAjaxRaw } from 'ic-ajax';

//...

    actions: {
        foo: function() {
            var req = icAjaxRaw({
                type: 'POST',
                url: ApiUtils.apiUrl+'/dofoo',
                processData: false,
            });

            return req.then(
                function resolve(result) {
                    console.log(result.response);
                    this.set('fooLastDoneAt', moment());
                }.bind(this)
            );
        },

...在测试中:

test('actions.foo', function() {
    expect(2);
    var ctrl = this.subject();
    var model = {
        fooLastDoneAt: moment().add(-10, 'days'),
    };
    ctrl.set('model', model);
    ok(ctrl.get('fooLastDoneAt').isBefore(moment().add(-1, 'days')), true, 'initial');
    ctrl.send('foo');
    ok(ctrl.get('fooLastDoneAt').isBefore(moment().add(-1, 'days')), false, 'updated date');
});

但是,这不可避免地会导致在另一个不相关的测试用例中抛出错误:

"Uncaught Error: Assertion Failed: calling set on destroyed object"[

这一定会发生,因为this.set('fooLastDoneAt', moment());在这个测试用例完成之后执行,并且测试运行器已经teardown为这个模块做了一个,然后继续下一个;当动作仍在执行时。

有没有办法让我等待一个动作异步完成,然后再进行下一步的单元测试?


@kingpin2k 建议使用此解决方案,您可以在其中将承诺延迟对象传递到操作中。但是,在我的应用程序中,应用程序本身永远不会这样做,如果我需要修改我的应用程序源以便对其进行测试,这似乎是一个基本问题 - 特别是因为它增加了复杂性。

还有其他方法可以使测试执行等待操作完成吗?

4

1 回答 1

1

我会去QUnit start() stop()功能。

这是取自 QUnit 文档的使用示例:

QUnit.test( "a test", function( assert ) {
  QUnit.stop();
  asyncOp();
  setTimeout(function() {
    assert.equals( asyncOp.result, "someExpectedValue" );
    QUnit.start();
  }, 150 );
});

ember-qunit库也用then.

这是示例ember-qunit

test('actions.foo', function() {
    expect(2);
    var ctrl = this.subject();
    var model = {
        fooLastDoneAt: moment().add(-10, 'days'),
    };
    ctrl.set('model', model);
    ok(ctrl.get('fooLastDoneAt').isBefore(moment().add(-1, 'days')), true, 'initial');
    ctrl.send('foo').then(function(){
      ok(ctrl.get('fooLastDoneAt').isBefore(moment().add(-1, 'days')), false, 'updated date');
    });
});

我没有测试代码,所以我希望它能解决你的问题

于 2014-07-16T09:20:15.567 回答