2012-03-02 6 views
5

jsFiddleコードに直接ジャンプしたい場合は、ここにあります:http://jsfiddle.net/bbkxK/2/ インスタンス内のクラス・レベルで指定されたバインディングをオーバーライドできますか?

理想的には、両方のオブジェクトインスタンスがメッセージに「何か」を出力することが理想です。

大規模なEmberアプリがあり、クラス定義のグローバルシングルトンに適切なデフォルトのバインディングを指定することで、コンベンションオーバー設定アプローチを使用したいと考えています(接線を外したい場合それは恐ろしいことだと思うし、もっと良い方法があると私は耳を傾けています。私は現在のアーキテクチャを気に入っていませんが、Emberの開発者が例示したアプリケーションを使って説明したパターンに従います。

したがって、実行中のアプリケーションで「うまく動作する」デフォルトのバインディングを指定します。そして、これまでのところすべてがうまくいっています。問題は単体テストを開始するときです。一度約500個の単体テストを実行したら、テスト分離に問題が発生しました。いくつかのテストではシングルトンコントローラの状態が更新され、他のテストは失敗するようになります。ここ数週間、大きな混乱と時間を浪費しています。

テストを分離するため、私たちは単体テストで作成したテスト対象のインスタンスで、クラスレベルで指定されているデフォルトのバインディングをオーバーライドしようとしました。多くの場合、シングルトンへのバインディングをモックオブジェクトへの静的な参照で置き換えることを試みます。これまでの私と?

多くのさまざまなアプローチを試した後、私が今まで考えてきた最良の戦略は、jsFiddleの例(http://jsfiddle.net/bbkxK/2/)で見ることができるMyApp.classWithDeferredDefaultBindingsパターンです。

しかし、それは、通常のEmberのやり方よりもはるかに冗長であり、ちょうどいい気分ではありません。 mixinやmonkey-patch Emberを作成してより良いものにすることができたと思いますが、私たちがそのステップを踏む前に、devs &コミュニティに連絡するのは楽しい時のようでした。

私のアプローチは単体テストのコンテキストでデフォルトのシングルトンバインディングをオーバーライドするのが妥当ですか? Emberにこれをよりシームレスにサポートする機能要求を出すべきですか?あなたはそれが実際にフレームワークのバグだと主張できますか?

答えて

5

まず、Emberのテスト方法についてもっと書く必要があることを念頭に置いておきます。

クラス定義内の絶対パスへのバインド(シングルトンに依存する)は大きなノーノだと言うのは良いルールだと思います。相対バインディングパスを使用するのは問題ありません。

シングルトンを使用しないようにすることをお勧めします。テストするのがずっと難しくなります。一般的なプラクティスでは、コントローラを常にクラスとして定義する必要があります。次に、アプリとテストでインスタンス化できます。あなたのテストでのシングルトンの使用に対処しようとするよりもはるかに簡単でエラーの発生が少ない

+1

シンプルなjsFiddleで問題を取り込むのは難しいです。私たちはテストでシングルトンを使わないようにしようとしていますが、デフォルトのバインディングを上書きする際に問題があります。私はそれが髪を分割していると思う、あなたはデフォルトバインディングを設定しないと言っている。私はほとんど同意しますが、500以上のクラス(コードベースは100,000行のオーダー)を持ち、初期化中にすべてを配線するのは難しくなってきています。私たちが本当に望むのは、シングルトンが存在し、ユニットテストで* * *オーバーライドされていない場合に自動的にバインドされる何らかの依存性代行システムです。これが、このバインディングパターンで達成しようとしていることです。 –

+1

また、ネストされたビューでそれを追加する必要があります。親ビューは、子ビュー内のコントローラや他のシングルトンのようなエンティティへの依存関係をすべて知っている必要はなく、ビューがインスタンス化されたときに通常は非常に動的です)。だから我々はcontrollerBindingを使っています: '...'は私たちの意見ではたくさんあり、これは安定した独立したテストを書く上で問題を抱えている主な領域です。しかし、私はこれをすべて説明しようとすると、ここではバインディングを使用すべきではないと確信しています。それは確かに不必要なパフォーマンスヒットです。ドローイングボードに戻って、私は思います。 –

+0

元の質問は基本的に無効です。アーキテクチャの欠陥があり、クラスレベルでのグローバル名前空間へのバインディングの指定を停止する必要があります。 –

関連する問題