1

我正在使用 Jasmine 对 EmberJS 项目进行单元测试,但我遇到了 Ember 需求 API 的问题。

当我尝试运行 jasmine 测试时,如果有问题的控制器具有“需要”以及调用的 init 函数,它们将无法创建控制器实例

this._super()

我收到此控制台错误

“不能调用方法‘有’为空”

当我尝试调试时,将我一路带入了 Ember 的内部,但我却一无所获。

任何人都知道我做错了什么

Application.SearchPendingController = Ember.ObjectController.extend({
    needs: ['searchResults', 'search'],
    shouldDisable: false,
    searchResultsController: null,
    init: function () {
        this._super();

        this.set('searchResultsController', this.controllerFor('searchResults'));

        this.get('controllers.search.content').reload();

        this.get('controllers.searchResults').set('content', this.get('controllers.search.content.results'));

    },
    transitionToResults: function () {
        console.log('yay');
    }.observes('this.searchResultsController.content')
});

当我尝试创建此控制器时,茉莉花测试会引发错误

var searchPendingController = Application.SearchPendingController.create();

有人对此有任何想法吗?

4

2 回答 2

8

当您创建控制器时,Ember.js 会检查needsinit 方法中的依赖项 ()。检查依赖项假设您有一个 Ember.js 应用程序,并且该应用程序的容器位于container控制器的属性中。如果 Ember.js 为您创建了控制器,这一切都很好。

您的错误发生在这里,在verifyDependencies函数中。

如果您不希望 Ember.js 为您创建控制器并希望手动创建它(这就是您在此处所做的),您将需要手动将控制器的container属性设置为应用程序的容器。

Application.SearchPendingController.reopen({
  container: Application.__container__
});

单元测试控制器很棘手,需要您深入了解 Ember.js 的内部结构。我的建议是,让 Ember.js 为您创建控制器,并使用集成测试而不是单元测试它们。

于 2013-03-21T13:13:42.580 回答
0

更好的是,如果您的控制器需要访问另一个控制器以计算某些属性,则让容器为您创建控制器。

Application.SearchPendingController = Ember.ObjectController.extend({
  needs: ['searchResults', 'search'],

测试

  var searchModel = something, 
    searchResultsModel = something, 
    searchPendingModel = something;

var container = Application.__container__,
  searchController = container.lookup('controller:search'),
  searchResultsController = container.lookup('controller:searchResults'),
  searchPendingController = container.lookup('controller:searchPending'),
  searchController.set('model', searchModel),
  searchResultsController.set('model', searchResultsModel ),
  searchPendingController.set('model', searchPendingModel );
于 2013-07-20T23:29:37.507 回答