gpt4 book ai didi

unit-testing - 在 Ember 路由单元测试中,我如何 stub setupController 然后测试路由方法

转载 作者:行者123 更新时间:2023-12-04 04:12:41 25 4
gpt4 key购买 nike

我有一个没有明确创建 Controller 文件的路由。我的路线看起来像:

import Ember from 'ember';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';
import vibrate from '../utils/utility-vibrate';

export default Ember.Route.extend(ApplicationRouteMixin, {
setupController: function(controller, model) {
this._super(controller, model);

controller.set('session', Ember.inject.service('session'));

controller.set('leftSidebarWidgets', []);
controller.set('rightSidebarWidgets', []);
controller.set('unpricedOrders', []);
controller.set('loadingUnpricedOrders', {value: true});
},
deleteRecordValidation: function(modelName) {
if (!modelName) {
return true;
}

if (modelName === 'orderItem') {
let rightHandWidgets = this.controller.get('rightSidebarWidgets');

if (rightHandWidgets.any(w => Ember.get(w, 'name') === 'widgets/add-update-order-item')) {
let orderItemDiv = Ember.$('.widgets\\/add-update-order-item');
vibrate(orderItemDiv);

return false;
}
}

return true;
}
...
});

然后我有一个单元测试:
import { moduleFor, test } from 'ember-qunit';

moduleFor('route:application', 'Unit | Route | application', {
needs: ['service:session']
});

test('delete record validation returns false if order item delete and update order item widget open', function(assert) {
assert.expect(1);

let route = this.subject();

route.controller.get('rightSidebarWidgets').insertAt(0, {
name: 'widgets/add-update-order-item'
});

assert.notOk(route.deleteRecordValidation('orderItem'));
});

我正在尝试向 Controller 添加一些内容以测试特定场景 - 问题是测试失败了 Cannot read property 'get' of undefined因为 route.controller 为空。我是否需要 stub 设置 Controller 或其他东西才能让“ Controller ”就位?如果是这样怎么办?

最佳答案

您实际上不需要 stub setupController 函数。除非您明确告诉它,否则它不会在您的单元测试中运行。但是您确实需要模拟 Controller 本身。

首先,在您的测试文件中,创建一个模拟 Controller :

let controller = Ember.Object.create();

如果你想向这个模拟对象添加字段,你可以在创建时添加它们:
let controller = Ember.Object.create({
someKey: someValue
});

或者稍后添加它们:
controller.set('someKey', someValue);

您现在可以将此模拟 Controller 传递给 setupController 函数进行测试:
route.setupController(controller, model);

您可以将其分配给您的路线以测试您的 deleteRecordValidation 功能:
let route = this.subject({
controller: controller
});

或者:
let route = this.subject();
route.controller = controller;

此时,您只需将任何字段添加到它在您正在测试的方法中使用的模拟 Controller 。您可以覆盖大多数不是关联的东西。

与往常一样,最好在单元测试中模拟您正在测试的内容之外的任何内容,因此这比导入实际 Controller 更可取。

关于unit-testing - 在 Ember 路由单元测试中,我如何 stub setupController 然后测试路由方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34267525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com