【问题标题】:Unit testing Ember.Object and DS.Model metaForProperty is inconsistent单元测试 Ember.Object 和 DS.Model metaForProperty 不一致
【发布时间】:2014-03-25 20:16:47
【问题描述】:

我正在为我们的 Ember 应用程序构建单元测试。我当前针对的测试集是我们的模型。我有一组测试非常适合基于 Ember 数据的模型,但在基于 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

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

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    是的,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

    【讨论】:

      【解决方案2】:

      这里有一组更新的断言对我有用。看起来因为它只使用 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');
      });
      

      【讨论】:

        猜你喜欢
        • 2013-08-16
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多