TypeError:无法读取属性' apply'未定义,使用javascript在测试中应用?

时间:2015-03-09 20:14:56

标签: javascript ember.js qunit ember-qunit

在qunit测试中使用apply(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)是否有限制?

import {
  moduleForModel,
  test
} from 'ember-qunit';

moduleForModel('enterprise', 'Enterprise Model', {});

test('salesTaxPercent gets converted from human readable decimal to float properly using convertPercentage helper method', function(assert) {
  var store = this.store();
  var model = this.subject({salesTaxPercent: 2.50});
  assert.equal(model.get('salesTax'), 0.025, 'salesTax computed property is 0.025');
});

import DS from 'ember-data';

export default DS.Model.extend({
   salesTax: DS.attr('number', {defaultValue: 0}),
   salesTaxPercent: function(key, value, previousValue) {
        return this.convertPercentage.apply(this, arguments);
    }.property('salesTax')
});

DS.Model.reopen({
 convertPercentage: function(key, value, previousValue) {
        var percentKey = arguments[0].replace('Percent','');
        if(arguments.length > 1) {
            this.set(percentKey, accounting.unformat((arguments[1]/100)));

        return Ember.isEmpty(this.get(percentKey)) ? null : accounting.unformat((this.get(percentKey) * 100).toFixed(2));
 }
});

此外,堆栈跟踪如下所示:

TypeError: Cannot read property 'apply' of undefined
    at null.<anonymous> (http://localhost:4200/provider/assets/inbox-dashboard.js:7099:42)
    at Descriptor.computedPropertySet [as _set] (http://localhost:4200/provider/assets/vendor.js:27308:20)
    at Descriptor.computedPropertySetWithSuspend [as set] (http://localhost:4200/provider/assets/vendor.js:27270:14)
    at set (http://localhost:4200/provider/assets/vendor.js:32804:14)
    at http://localhost:4200/provider/assets/vendor.js:33575:11
    at tryFinally (http://localhost:4200/provider/assets/vendor.js:34504:28)
    at changeProperties (http://localhost:4200/provider/assets/vendor.js:32529:7)
    at setProperties (http://localhost:4200/provider/assets/vendor.js:33568:7)
    at __exports__.default.Mixin.create.setProperties (http://localhost:4200/provider/assets/vendor.js:48068:16)
    at Ember.Object.extend.createRecord (http://localhost:4200/provider/assets/vendor.js:119923:16)TypeError: Cannot read property 'apply' of undefined
    at null.<anonymous> (http://localhost:4200/provider/assets/inbox-dashboard.js:7099:42)
    at Descriptor.computedPropertySet [as _set] (http://localhost:4200/provider/assets/vendor.js:27308:20)
    at Descriptor.computedPropertySetWithSuspend [as set] (http://localhost:4200/provider/assets/vendor.js:27270:14)
    at set (http://localhost:4200/provider/assets/vendor.js:32804:14)
    at http://localhost:4200/provider/assets/vendor.js:33575:11
    at tryFinally (http://localhost:4200/provider/assets/vendor.js:34504:28)
    at changeProperties (http://localhost:4200/provider/assets/vendor.js:32529:7)
    at setProperties (http://localhost:4200/provider/assets/vendor.js:33568:7)
    at __exports__.default.Mixin.create.setProperties (http://localhost:4200/provider/assets/vendor.js:48068:16)
    at Ember.Object.extend.createRecord (http://localhost:4200/provider/assets/vendor.js:119923:16)

1 个答案:

答案 0 :(得分:0)

初始化程序不在单元测试componentForModel中运行,因此this.convertPercentage未定义(如错误所示)。

所以我的建议是从你的模型中导入这个函数,然后附上它:

import convertPercentage from "../utils/convert-percentage";

export default DS.Model.extend({
  salesTaxPercent: function(key, value, previousValue) {
    return this.convertPercentage.apply(this, arguments);
  }.property('salesTax')
});

https://github.com/rwjblue/ember-qunit/issues/149#event-261578363