我想对一个控制器进行单元测试,该控制器会在属性发生变化时触发事件.
控制器看起来像这样:
App.MyController = Ember.Controller.extend({
...
observeFilterFieldChanges: function() {
console.log("observeFilterFieldChanges");
this.setActiveSortField();
this.send("queryChanged");
}.observes("sorting.fields.@each.active"),
...
});
Run Code Online (Sandbox Code Playgroud)
我的测试如下:
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");
});
});
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为从不调用控制器中的操作queryChanged.(但观察者确实被召唤)
如果发送事件,测试的最佳方法是什么?
更新清晰:以上代码在App中运行良好.在路线中很好地消耗了发送的动作.所有我想要的是单元测试,以保护我免受未来的变化:)
测试操作的最佳方法是触发它并断言任何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');
});
Run Code Online (Sandbox Code Playgroud)
请参阅更新的测试指南:http://emberjs.com/guides/testing/testing-controllers/
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |