diff --git a/addon-test-support/@ember/test-helpers/setup-rendering-context.js b/addon-test-support/@ember/test-helpers/setup-rendering-context.js index 1a8bbe208..7267f3296 100644 --- a/addon-test-support/@ember/test-helpers/setup-rendering-context.js +++ b/addon-test-support/@ember/test-helpers/setup-rendering-context.js @@ -154,11 +154,11 @@ export default function setupRenderingContext(context) { // these methods being placed on the context itself will be deprecated in // a future version (no giant rush) to remove some confusion about which // is the "right" way to things... - context.render = render; - context.clearRender = clearRender; + Object.defineProperty(context, 'render', { value: render, writable: false }); + Object.defineProperty(context, 'clearRender', { value:clearRender, writable: false }); if (global.jQuery) { - context.$ = jQuerySelector; + Object.defineProperty(context, '$', { value: jQuerySelector, writable: false }); } // When the host app uses `setApplication` (instead of `setResolver`) the event dispatcher has @@ -190,18 +190,20 @@ export default function setupRenderingContext(context) { }); }) .then(() => { - // ensure the element is based on the wrapping toplevel view - // Ember still wraps the main application template with a - // normal tagged view - // - // In older Ember versions (2.4) the element itself is not stable, - // and therefore we cannot update the `this.element` until after the - // rendering is completed - if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) { - context.element = getRootElement().querySelector('.ember-view'); - } else { - context.element = getRootElement(); - } + Object.defineProperty(context, 'element', { + // ensure the element is based on the wrapping toplevel view + // Ember still wraps the main application template with a + // normal tagged view + // + // In older Ember versions (2.4) the element itself is not stable, + // and therefore we cannot update the `this.element` until after the + // rendering is completed + value: EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false + ? getRootElement().querySelector('.ember-view') + : getRootElement(), + + writable: false, + }); return context; }); diff --git a/tests/unit/setup-rendering-context-test.js b/tests/unit/setup-rendering-context-test.js index 59ba46d78..f835ad70a 100644 --- a/tests/unit/setup-rendering-context-test.js +++ b/tests/unit/setup-rendering-context-test.js @@ -30,6 +30,14 @@ module('setupRenderingContext', function(hooks) { setResolver(resolver); }); + function overwriteTest(key) { + test(`throws an error when trying to overwrite this.${key}`, function(assert) { + assert.throws(() => { + this[key] = null; + }, TypeError); + }); + } + function setupRenderingContextTests(hooks) { hooks.beforeEach(async function() { setResolverRegistry({ @@ -72,6 +80,8 @@ module('setupRenderingContext', function(hooks) { }); } + overwriteTest('element'); + test('render can be used multiple times', async function(assert) { await this.render(hbs`

Hello!

`); assert.equal(this.element.textContent, 'Hello!'); @@ -108,6 +118,9 @@ module('setupRenderingContext', function(hooks) { assert.strictEqual(this.element, originalElement, 'this.element is stable'); }); + overwriteTest('render'); + overwriteTest('clearRender'); + (hasjQuery() ? test : skip)('this.$ is exposed when jQuery is present', async function(assert) { await this.render(hbs`

Hello!

`);