You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:28:09