简体   繁体   中英

In Ember js, how to create or mock hasMany relationship in unit test

I'm unit-testing a model which has properties with DS.hasMany() relationships. Whenever I do the following unit-test, I keep getting this error in my test-runner: Error: Assertion Failed: All elements of a hasMany relationship must be instances of DS.Model, you passed [<Ember.Object:ember367>,<Ember.Object:ember368>]

Can someone shed some light into this, please?

Model:

export default DS.Model.extend({
  accounts: DS.hasMany('account'),
  servicesAccounts: DS.hasMany('services-account'),
  address: MF.fragment('address'),
  appEligibilities: MF.fragmentArray('app-eligibility'),

  appsForPremise: Ember.computed('accounts', function () {
    return DS.PromiseArray.create({
      promise: this.get('store').find('app', {
        account: this.get('accounts').mapBy('id')
      })
    });
  })
});

Model uni-test:

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

moduleForModel('premise', 'Unit | Model | premise', {
  needs: [
    'model:account',
    'model:services-account',
    'model:address',
    'model:app-eligibility'
  ]
});

test('Apps for premise', function (assert) {
  let model = this.subject({
      accounts: [Ember.Object.create({
        id: 'account-1'
      }),
      Ember.Object.create({
        id: 'account-2'
      })],
      appsForPremise: sinon.spy()
    });

  Ember.run(() => {
  });

  assert.equal(model.get('appsForPremise'), '[{id: account-1}, {id: account-2}]');

});

You cant pass regular ember objects to the hasMany relationship, they have to be store model objects. You can create them using the store, ie

 const store = this.store();
 Ember.run(() => {
    const model = this.subject({
        accounts: [
          store.createRecord('services-account', {
            id: 'account-1'
        }),
          store.createRecord('services-account',{
            id: 'account-2'
        })],
        appsForPremise: sinon.spy()
    });
 });

Calls to the store methods have to go into the run loop, otherwise Ember will complain.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM