Jasmine测试失败了EmberJS需要API

joh*_*njo 1 javascript unit-testing jasmine ember.js

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

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

this._super()

我收到此控制台错误

"无法调用方法'有'null'

当我试图调试时,把我带到了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')
});
Run Code Online (Sandbox Code Playgroud)

当我尝试创建此控制器时,jasmine测试会抛出错误

var searchPendingController = Application.SearchPendingController.create();
Run Code Online (Sandbox Code Playgroud)

有人对此有什么想法吗?

Ted*_*nny 8

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

你的错误发生在这里,在verifyDependencies函数中.

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

Application.SearchPendingController.reopen({
  container: Application.__container__
});
Run Code Online (Sandbox Code Playgroud)

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