在验收测试中访问它后获取路由模型
Posted
技术标签:
【中文标题】在验收测试中访问它后获取路由模型【英文标题】:Get model of route after visiting it in acceptance test 【发布时间】:2015-11-13 21:18:31 【问题描述】:我正在尝试编写验收测试,以查看模型中我访问的路线的某个属性是否等于我所断言的。
我不会使用这条路由将信息输出到页面,而是使用 ember 插件将其中的一部分保存到本地存储。所以通常我意识到我可以使用find()
在页面上查找一个元素并检查它的内容以确定模型是否正在解析,但这不适用于这种情况。
在验收测试中我有这个设置(使用 mirage btw)
test('Returns a user', function(assert)
// Generate a user
var user = server.create('user',first_name: 'Jordan');
// Visit the index page with the users short_url
visit('/' + user.short_url);
var route = this.application.__container__.lookup('route:index');
// Assert that the model the user we created by checking the first name we passed in
assert.equal(route.model.first_name,'Jordan','Model returns user with first name Jordan');
);
但是当我运行测试时,结果显示为undefined
更新:
在尝试了 Daniel Kmak 的答案后,我仍然无法通过。这是我正在使用的路由代码
import Ember from 'ember';
import LocalUser from 'bidr/models/user-local';
export default Ember.Route.extend(
localUser: LocalUser.create(),
navigationService: Ember.inject.service('navigation'),
activate()
this.get('navigationService').set('navigationMenuItems', []);
,
beforeModel()
this.localUser.clear();
,
model(params)
var self = this;
return this.store.queryRecord('user',short_url: params.short_url).then(function(result)
if(result)
self.set('localUser.user',
"id": result.get('id'),
"first_name": result.get('first_name'),
"active_auction": result.get('active_auction'),
"phone": result.get('phone')
);
// transition to event page
self.transitionTo('items');
else
self.transitionTo('home');
);
);
测试看起来像这样
import Ember from 'ember';
import module, test from 'qunit';
import startApp from 'bidr/tests/helpers/start-app';
module('Acceptance | index route',
beforeEach: function()
this.application = startApp();
,
afterEach: function()
Ember.run(this.application, 'destroy');
);
test('Returns a user', function(assert)
var user = server.create('user',first_name: 'Jordan');
visit('/' + user.short_url);
var route = this.application.__container__.lookup('route:index');
andThen(function()
assert.equal(route.get('currentModel.first_name'),'Jordan','Model returns user with first name Jordan');
);
);
所有代码在开发中都可以正常工作。
【问题讨论】:
我会尝试使用controller.model
而不是route.model
以避免异步行为
那么如何让控制器在测试中可以访问?我尝试将查找更改为controller:index
,但我仍然无法访问它
您能否分享您访问的路由的路由器代码以及 user.short_url 的示例值以及该路由的模型函数?
我已经更新了我的答案。它应该可以工作。
【参考方案1】:
好的,所以我已经在 Ember 中进行了测试,看来你应该很擅长在 andThen
hook 中获取模型:
test('returns a user', function(assert)
visit('/'); // visit your route
var route = this.application.__container__.lookup('route:index'); // find your route where you have model function defined
andThen(function()
console.log(route.get('currentModel')); // your model value is correct here
assert.equal(currentURL(), '/'); // make sure you've transitioned to correct route
);
);
获取您的代码应该可以正常运行:
test('Returns a user', function(assert)
var user = server.create('user',first_name: 'Jordan');
visit('/' + user.short_url);
var route = this.application.__container__.lookup('route:index');
andThen(function()
assert.equal(route.get('currentModel.first_name'),'Jordan','Model returns user with first name Jordan');
);
);
另外需要注意的是,您可以通过route.currentModel
属性访问模型。
对于我的模型:
export default Ember.Route.extend(
model()
return Ember.RSVP.hash(
simple: 'simpleValue',
promise: Ember.RSVP.resolve(5)
);
);
在andThen
和console.log(route.get('currentModel'));
我得到了:
Object simple: "simpleValue", promise: 5
已记录。
【讨论】:
当我更改为TypeError: Cannot read property 'model' of undefined
并将路由变量记录到控制台返回未定义。但是使用route:index
将路由记录到控制台会返回路由类。
还是不及格,我把我的路由代码和当前的测试加在问题里以上是关于在验收测试中访问它后获取路由模型的主要内容,如果未能解决你的问题,请参考以下文章
Yii2 验收测试。在每次测试后回滚在验收测试中所做的所有更改
如何使用 NServiceBus 验收测试从 saga 处理程序获取反馈
如何在 Codeception 验收测试中为 <input type="email"> 获取 WebGuy->fillField?