调用

时间:2016-08-24 19:28:17

标签: ember.js ember-qunit

我正在尝试对已经编写的Ember插件进行单元测试,但遗憾的是在创建时没有经过测试。如果可能的话,我真的不想修改现有的代码库来适应测试。

控制器代码

foo() {
    return this.get('store').query('stuff', query)
        .then((data) => {
            this.setProperties({
                myList: []
            });

            data.get('content').mapBy('record').forEach((item) => {
                // fails here
                this.get('myList').pushObject(item);
            });
        });
    });
}

测试代码

beforeEach() {
    let data = Ember.Object.create({
        content: Ember.A([
            { record: { } },
            { record: { } }
        ]);
    });

    this.controller = this.subject({
        store: {
            query(property, query) {
                return new Ember.RSVP.Promise(function (resolve) {
                    resolve(data);
                });
            }
        }
    });
}

test('failing test case', function (assert) {
    this.controller.foo();
}

错误:

Uncaught TypeError: _this.get(...).pushObject is not a function

我做了一些研究,发现Ember默认扩展对象原型,以便标准数组([])成为Ember数组。我已经检查了如何禁用原型扩展here中提到的config/environment.js,它只返回并清空对象{}。

为什么Ember不包装数组并允许我像我在测试中所期望的那样使用pushObject

PS:我注意到有一个包禁用针对插件作者的原型扩展,但我再没有这个包了 https://github.com/rwjblue/ember-disable-prototype-extensions

1 个答案:

答案 0 :(得分:1)

使用原型扩展并不是一个好主意。这就是创建ember-disable-prototype-extensions的原因

当您提供有关包和环境的移动信息时,没有人能够回答为什么Ember不会在您的应用中扩展数组。但你可以通过显式使用Ember.Array

来解决问题

而不是

   this.setProperties({
        myList: []
    });

使用

   this.setProperties({
        myList: Ember.A()
    });

这将是很好的原因,以防止将来出现此类错误(更新依赖项/包)