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
相关产品推荐
相关产品推荐

