在控制器中测试Ember.js的路由导航

Testing Ember.js route navigation from within a controller

本文关键字:路由 导航 js Ember 控制器 测试      更新时间:2023-09-26

我试图在我的ember-cli应用程序中编写一个测试,测试一个特定的控制器动作是否会根据页面上输入的值将用户带到特定的路由。

下面是我得到的错误:

IndexController: the setTable action navigates to the tables route
    ✘ Died on test #1     at http://localhost:7357/assets/qunit.js:425
        at test (http://localhost:7357/assets/vendor.js:72425)
        at :29
        at http://localhost:7357/assets/vendor.js:54
        at http://localhost:7357/assets/test-loader.js:14: 'null' is not an object (evaluating 'target.transitionToRoute')

如果我在浏览器中尝试,我在控制台中得到的错误是:

Error while loading route: undefined

我的路由已经定义,这是我的路由器:

import Ember from 'ember';
var Router = Ember.Router.extend({
  location: AccelewaiterENV.locationType
});
Router.map(function() {
  this.route('table', { path: '/table/:table_id' });
});
export default Router;

这是我的测试:

import { test, moduleFor } from 'ember-qunit';
moduleFor('controller:index', 'IndexController', {
  // Specify the other units that are required for this test.
  // needs: ['controller:foo']
});
test('the setTable action navigates to the tables route', function() {
  var controller = this.subject();
  controller.set('tableNumber', 1);
  controller.send('setTable');
  ok(controller.get('currentPath') === '/table/1');
});

这是我的模板:

<div class="start">
  <div class="row">
    <div class="col-xs-12">
      {{input type="text"
        valueBinding="tableNumber"
        class="form-control input-lg"
        placeholder="Enter Table #"}}
      <button {{ action 'setTable' }}
         id="submit-table"
         class="btn btn-success">Ok</button>
    </div>
  </div>
</div>

这是我的控制器:

import Ember from 'ember';
export default Ember.Controller.extend({
  tableNumber: null,
  actions: {
    setTable: function() {
      var tableNumber = this.get('tableNumber');
      console.log(this.transitionTo);
      this.transitionToRoute('table/' + tableNumber);
    }
  }
});

我还创建了一个表控制器,但它目前是空的。

任何帮助都非常感谢!

transitionTo只存在于扩展Ember.Route的项上。

对于扩展Ember.Controller/Ember.ObjectController/Ember.ArrayController的项目应使用transitionToRoute

另外,currentPath只存在于ApplicationController和集成测试中。看起来你把集成测试和单元测试混在一起了。

举例:http://emberjs.jsbin.com/wipo/33/edit