ember.js version: 2.18.0
route:
export default Route.extend({
actions: {
createBand: function() {
var controller = this.get('controller');
var band = this.store.createRecord('band', controller.getProperties('name'));
band.save().then(() => {
controller.set('name', '');
this.transitionTo("bands.band.songs", band);
});
}
}
});
New records can be saved sound and good in dev. The problem comes out during acceptance tests:
Assertion Failed: 'band' was saved to the server, but the response does not have an id and your record does not either.
the test code:
test('Create a new band', function(assert) {
server = new Pretender(function() {
this.get('/bands', function() {
var response = {
data: [
{
id: 1,
type: 'bands',
attribute: {
name: 'Radiohead'
}
}
]
};
return [200, contentType, JSON.stringify(response)];
});
this.post('/bands', function() {
var response = {
data: [
{
id: 2,
type: 'bands',
attributes: {
name: 'Long Distance Calling'
}
}
]
};
return [200, contentType, JSON.stringify(response)];
});
this.get('/bands/2/songs', function() {
var response = { data: [] };
return [200, contentType, JSON.stringify(response)];
});
});
visit('/bands');
fillIn('.new-band', 'Long Distance Calling');
click('.new-band-button');
andThen(function() {
assert.equal(find('.band-link').length, 2, 'All band links are rendered.');
assert.equal(find('.band-link:last').text().trim(), 'Long Distance Calling', 'Created band appears at the end of the list.');
assert.equal(find('.nav a.active:contains("Songs")').length, 1, 'The Songs tab is active.');
});
});
When I was debugging, I found the following function in the ember.js framework where internalModel did not have any properties and therefore the assert() got triggered in testing mode.
updateId: function updateId(internalModel, data) {
var oldId = internalModel.id;
var modelName = internalModel.modelName;
var id = coerceId(data.id);
// ID absolutely can't be missing if the oldID is empty (missing Id in response for a new record)
(true && !(!(id === null && oldId === null)) && Ember.assert('\'' + modelName + '\' was saved to the server, but the response does not have an id and your record does not either.', !(id === null && oldId === null)));
// code that follows omitted here
}
Any ideas?