单元测试Ember.Object和DS.Model metaForProperty不一致

时间:2014-03-25 20:16:47

标签: ember.js ember-data

我正在为我们的Ember应用程序构建单元测试。我目标的当前测试集是我们的模型。我有一组测试对基于Ember Data的模型非常有效,但在基于Ember.Object时似乎失败了。以下是两个例子:

App.Person = DS.Model.extend({
    First: DS.attr("string"),
    Last:  DS.attr("string")
});

App.Person2 = Ember.Object.extend({
    First: null,
    Last:  null
});

为DS.Model传递的测试:

it('has a valid attribute: First', function() {
    var property = App.Person.metaForProperty('First');
    expect( property.type ).to.eql('string');
    expect( property.isAttribute ).to.eql(true);
});

然后,当为Ember.Object使用相同的结构时:

it('has a valid attribute: First', function() {
    var property = App.Person2.metaForProperty('First');
});

我收到以下错误:

Error: Assertion Failed: metaForProperty() could not find a computed property with key 'First'.
    at new Error (native)
    at Error.Ember.Error (http://0.0.0.0:3385/app/js/components/ember/ember.js:844:19)
    at Object.Ember.assert (http://0.0.0.0:3385/app/js/components/ember/ember.js:73:11)
    at Function.Mixin.create.metaForProperty (http://0.0.0.0:3385/app/js/components/ember/ember.js:13247:11)
    at Context.<anonymous> (http://0.0.0.0:3385/tests/model-person-test.js:6:35)
    at invoke (http://0.0.0.0:3385/tests/bower_components/ember-mocha-adapter/adapter.js:60:8)
    at Context.suite.on.context.it.context.specify.method (http://0.0.0.0:3385/tests/bower_components/ember-mocha-adapter/adapter.js:102:13)
    at Test.require.register.Runnable.run (http://0.0.0.0:3385/tests/assets/mocha.js:4200:15)
    at Runner.require.register.Runner.runTest (http://0.0.0.0:3385/tests/assets/mocha.js:4591:10)
    at http://0.0.0.0:3385/tests/assets/mocha.js:4637:12

任何人都可以提供有关可能出现问题的见解吗?

2 个答案:

答案 0 :(得分:0)

是的,First / Last不是Person2上的计算属性,它们只是属性。

这样可行

App.Person2 = Ember.Object.extend({
    First: null,
    Last:  null,
    Blah: function(){

    }.property('First')
});

var j = App.Person2.metaForProperty('Blah');
console.log(j);

当您执行DS.attr()时,Ember Data实际上是在那里注入计算属性,请参阅:Ember Data attr Source

答案 1 :(得分:0)

这是一组适用于我的更新断言。看起来因为它只使用了Ember.Object,DS.Model的额外好处根本就不存在。

it('has a valid attribute: First', function() {
    var person = App.Person.create({
            id: 1,
            First: 'Andy'
        });
    expect( App.Person.proto().hasOwnProperty('First') ).to.eql(true);
    expect(typeof person.get('First')).to.eql('string');
    expect(person.get('First')).to.eql('Andy');
});