Ember.js测试中访问this.owner属性及提取重复adapter lookup代码至类级变量的实现方案
解决Ember.js测试中
this.owner访问与适配器实例复用的问题 我来帮你搞定这两个Ember测试里的问题!先给你理清楚核心逻辑,再给你修改后的代码示例。
1. 关于this.owner的访问时机
你猜的没错,this.owner只能在测试上下文初始化完成后才能访问——也就是test()函数的回调内部,或者module的hooks钩子(比如beforeEach/afterEach)的回调里。
module作用域里的代码会在setupTest(hooks)执行前就跑起来,这时候Ember还没初始化好测试上下文,this.owner根本不存在,直接调用自然会失败。
2. 复用适配器实例的正确姿势
要避免每个test里重复写this.owner.lookup,你可以用hooks.beforeEach钩子,在每个测试执行前统一初始化适配器,然后把它挂载到测试上下文上,所有test就能直接复用了。
修改后的完整代码如下:
import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; module('Unit | Adapter | assessment', function (hooks) { setupTest(hooks); let myVar = 'abc'; // 每个测试执行前初始化适配器,挂载到测试上下文 hooks.beforeEach(function() { this.adapter = this.owner.lookup('adapter:assessment'); }); test('it exists', function (assert) { console.log(myVar); // 直接用this.adapter即可 assert.ok(this.adapter); }); test('Test 1', function (assert) { console.log(myVar); console.log(this.adapter); // 现在能正常访问了! assert.ok(this.adapter); }); test('Test 2', function (assert) { console.log(myVar); console.log(this.adapter); assert.ok(this.adapter); }); test('Test 3', function (assert) { console.log(myVar); console.log(this.adapter); assert.ok(this.adapter); }); });
补充说明
hooks.beforeEach的回调会在setupTest之后、每个test之前执行,这时候测试上下文已经完全初始化,this.owner可以正常调用。- 如果你的适配器是无状态的,也可以用
hooks.before(只初始化一次)代替beforeEach,但单元测试一般推荐每个test用全新实例,避免测试间的状态污染,所以beforeEach更稳妥。
内容的提问来源于stack exchange,提问作者RonPringadi
相关产品推荐
相关产品推荐

