From b40848fe1d2eccde3f24e8bb75602ad154537d9d Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Sat, 25 Oct 2014 15:13:40 -0400 Subject: [PATCH] Add a assertion when watched props are are written to without Em.set. --- packages/ember-metal/lib/property_get.js | 4 +++ .../tests/accessors/mandatory_setters_test.js | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/packages/ember-metal/lib/property_get.js b/packages/ember-metal/lib/property_get.js index a0ae18a4926..fe3317d3085 100644 --- a/packages/ember-metal/lib/property_get.js +++ b/packages/ember-metal/lib/property_get.js @@ -81,6 +81,10 @@ var get = function get(obj, keyName) { if (Ember.FEATURES.isEnabled('mandatory-setter')) { if (hasPropertyAccessors && meta && meta.watching[keyName] > 0) { ret = meta.values[keyName]; + + if (ret === undefined && keyName in obj && !(keyName in meta.values)) { + Ember.assert('You must use Ember.set to set `' + keyName + '` (on `' + obj + '`).'); + } } else { ret = obj[keyName]; } diff --git a/packages/ember-metal/tests/accessors/mandatory_setters_test.js b/packages/ember-metal/tests/accessors/mandatory_setters_test.js index 57755fcaaf1..32f633ed443 100644 --- a/packages/ember-metal/tests/accessors/mandatory_setters_test.js +++ b/packages/ember-metal/tests/accessors/mandatory_setters_test.js @@ -32,6 +32,22 @@ if (Ember.FEATURES.isEnabled('mandatory-setter')) { }, 'You must use Ember.set() to set the `someProp` property (of custom-object) to `foo-bar`.'); }); + test('should assert if get a watched property (not on the prototype) that is not set by Ember.set', function() { + var obj = { + toString: function() { + return 'custom-object'; + } + }; + + watch(obj, 'someProp'); + + obj.someProp = 'foo-bar'; + + expectAssertion(function() { + get(obj, 'someProp'); + }, 'You must use Ember.set to set `someProp` (on `custom-object`).'); + }); + test('should not assert if set with Ember.set when property is being watched', function() { var obj = { someProp: null, @@ -45,6 +61,20 @@ if (Ember.FEATURES.isEnabled('mandatory-setter')) { equal(get(obj, 'someProp'), 'foo-bar'); }); + + test('prints a helpful assertion if a watched property (not present at watch time) was not set with Ember.set', function() { + var obj = { + toString: function() { + return 'custom-object'; + } + }; + + watch(obj, 'someProp'); + obj.someProp = 'blastix'; + + equal(get(obj, 'someProp'), 'blastix'); + }); + } else { test('does not assert', function() { var obj = {