1

Jasmine を使用して EmberJS プロジェクトの単体テストを行っていますが、Ember のニーズ API に問題があります。

jasmine テストを実行しようとすると、問題のコントローラーに「ニーズ」と呼び出す init 関数がある場合、コントローラー インスタンスの作成に失敗します。

this._super()

このコンソールエラーが発生します

「null のメソッド 'has' を呼び出すことはできません」

私がデバッグしようとしたとき、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.jsneedsは init メソッドで依存関係 ( ) をチェックします。依存関係のチェックは、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 に答える