0

Is there limitations with using apply (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) in qunit tests?

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));
 }
});

Also the stacktrace looks like this:

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)
flylib
  • 1,128
  • 2
  • 10
  • 17
  • 1
    What is `convertPercentage`? It's not defined in the code you've posted, and would therefore cause the exact error you're reporting. – James Thorpe Mar 09 '15 at 20:22
  • my bad, its in the model reopen, posted the code above, this code above works fine in live app also, it's the test where it's crashing – flylib Mar 10 '15 at 03:59

1 Answers1

0

Initializers are not run in unit tests componentForModel, therefore this.convertPercentage is undefined (as the error suggests).

So my suggestion is to import the function from your model and just attach it:

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

flylib
  • 1,128
  • 2
  • 10
  • 17