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

Ember测试中如何获取路由的model()返回结果?

解决Ember测试中获取自定义路由Model的问题

我明白你遇到的困境——当路由的Model不是来自Ember Store而是自定义异步返回值时,常规的lookup方法好像不管用。别担心,这里有两种针对不同测试场景的解决方案:

1. 单元测试路由的Model钩子

如果是单独测试路由的Model逻辑,你可以直接调用路由的model()方法,不过要注意处理异步和依赖模拟:

import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import MyCustomRoute from 'your-app/routes/your-route-name';
import RSVP from 'rsvp';

module('Unit | Route | custom route', function(hooks) {
  setupTest(hooks);

  test('model hook returns expected hash', async function(assert) {
    // 获取路由实例
    const route = this.owner.lookup('route:your-route-name');
    
    // 模拟你的someCall()返回值(根据实际依赖调整)
    // 比如如果someCall是某个服务的方法,先注册mock服务
    const mockReturnValue = 'test-data';
    this.owner.register(
      'service:your-service',
      { someCall: () => RSVP.resolve(mockReturnValue) },
      { instantiate: false }
    );

    // 调用model钩子并等待异步完成
    const model = await route.model();
    assert.equal(model.value, mockReturnValue, 'Model hash contains correct value');
  });
});

关键是要确保someCall()的依赖被正确模拟,避免测试依赖外部资源或未初始化的服务。

2. 集成/验收测试中获取Model

如果是在完整的路由访问测试中,你需要先等待路由加载完成,再从对应的控制器中获取Model:

import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
import { visit, currentRouteName } from '@ember/test-helpers';

module('Acceptance | custom route', function(hooks) {
  setupApplicationTest(hooks);

  test('can access route model after visiting', async function(assert) {
    // 访问目标路由,等待页面和路由加载完成
    await visit('/your-route-path');
    
    // 确认当前路由正确
    assert.equal(currentRouteName(), 'your-route-name', 'Successfully navigated to target route');

    // 获取对应控制器并读取Model
    const controller = this.owner.lookup('controller:your-route-name');
    const model = controller.get('model');
    
    assert.ok(model, 'Model is present on controller');
    assert.equal(model.value, 'expected-value', 'Model has the correct data');
  });
});

为什么你之前的方法可能失败?

  • 如果你在集成测试中没有等待visit()完成就去lookup控制器,此时路由的Model钩子还没执行完毕,自然拿不到Model。
  • 单元测试中如果没有模拟someCall()的依赖,model()可能返回一个被拒绝的Promise,导致你获取不到有效数据。

内容的提问来源于stack exchange,提问作者Christian Neverdal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:28:04