我想对一个控制器进行单元测试,该控制器会在属性发生变化时触发事件。
控制器看起来像这样:
App.MyController = Ember.Controller.extend({
...
observeFilterFieldChanges: function() {
console.log("observeFilterFieldChanges");
this.setActiveSortField();
this.send("queryChanged");
}.observes("sorting.fields.@each.active"),
...
});
我的测试如下:
test('changing sort field via sort.fields will trigger query changed', function () {
var queryChangedCalled = false;
var tmpListController = App.MyController.create({
actions: {
queryChanged: function () {
console.log("querychanged called from controller");
queryChangedCalled = true;
}
}
});
// trigger the change
tmpListController.set("sorting.fields.0.active", true);
stop();
// not sure if I need to wait for the run loop to finish
Ember.run.schedule('afterRender', this, function () {
start();
ok(queryChangedCalled, "querChangedCalled should be true");
});
});
这不起作用,因为从不调用控制器中的操作queryChanged。 (但是观察者确实被召唤了)
测试事件是否发送的最佳方法是什么?
为清晰起见更新: 以上代码在App中运行良好。在路线中很好地消耗了发送的动作。我想要的只是单元测试以保护我免受未来的变化:)
答案 0 :(得分:0)
测试操作的最佳方法是触发它并断言this.setActiveSortField();
更改。
如果观察者失败,则activeSortField无法断言。 如果操作失败,则应该抛出错误。
moduleFor('controller:mycontroller', 'MyController Controller');
test('changing sort field via sort.fields will trigger query changed', function(assert) {
assert.expect(1);
// grab an instance of `MyController`
var ctrl = this.subject();
Ember.run(function() {
ctrl.set('sorting.fields.0.active', true);
assert.equal(ctrl.get('activeSortField'), 'bar');
});
请参阅更新的测试指南:http://emberjs.com/guides/testing/testing-controllers/