1

数学の個別指導アプリケーションを構築しており、angular の e2e テスト スイートを使用して UI をテストしたいと考えています。

現在、ランダムな分数を生成し、一連の陰影付きおよび陰影なしのボックスを表示し、ユーザーに陰影によって形成された分数を入力するよう求める分数ページに取り組んでいます。

e2e testを使用して、UI が正しい入力と正しくない入力の両方にどのように応答するかをテストしたいと思います。ただし、ページの読み込み時に分数がランダム化されるため、テスト内からの「正しい」入力が何であるかはわかりません。

入力に対する正しい答えを得る最も簡単な方法は$scope.problemObject、コントローラーの at にある Fraction オブジェクトにアクセスし、その API 関数.getNumerator()とを呼び出すこと.getDenominator()です。ただし、テスト内からこのオブジェクトにアクセスする方法が見つかりませんでした。

私のコントローラーからの関連行は次のとおりです。

$scope.problemObject = Fraction.random();
// This produces an object with two relevant 
// functions (getNumerator() & getDenominator())

私が試したこと

  • binding()

最初は必要なことを行うと思っていましたが、などbinding()へのすべての呼び出しは、バインディングが見つからないというエラーを発行します。これは、と の戻り値がUI に直接バインドされていないためだと思われます。binding('problemObject')binding('problemObject.getNumerator()'$scope.problemObject$scope.problemObject.getNumerator()

  • angular.element().scope()

angular.element('#problem').scope().problemObject私がテストしているページのコンソールからの実行は完全に機能します。ただし、テスト内から同じ行を試すと、「セレクターが実装されていません」というエラーが発生します。

私もいくつかのバリエーションを試しました:

element('#problem').scope().problemObject: エラー: 'オブジェクト # にはメソッド 'scope' がありません''

angular.element(element('#problem')).scope().problemObject: エラー: 「未定義のプロパティ 'problemObject' を読み取ることができません」

4

2 に答える 2

0

e2e test の「element」と「angular.element」は別のオブジェクトだと思います。ビューから値を読み取ってみることをお勧めします。

入力欄の場合。

var value = element('#problem').val();

それ以外の場合は、次のようになります。

var value = element('#problem').text();

(私の意見では、e2e からスコープ オブジェクトを調べることは一種の不正行為です。)

編集

私はウェブページの質問と構造を完全に誤解していました。混乱させて申し訳ありません。検証する必要があるのは、陰影のあるボックスと影のないボックスの番号 (この例では 'td' 要素) に対する入力フィールドです。

var total = element('td').count()
  , fraction = element('td.shaded').count();

アイデアは同じです。$scope からではなく、ビューから数値を取得しようとしています。

于 2012-08-15T03:13:09.690 に答える
0

問題は、jQuery の に格納されているスコープにあることが判明しましたdata。jQuery はデータをハッシュテーブルに$.cacheグローバルとして格納するため、テスト Web ページが実行されているフレームの外に出ると、それらにアクセスできなくなります。私がそれを解決した方法は、iframeのウィンドウ内のjQueryにアクセスすることです($windowパラメータで便利に指定されています)。

以下は、スコープにアクセスするために私が思いついたものです。scope('#myElement', 'foo.bar')クエリを実行できます$scope.foo.bar

angular.scenario.dsl('scope', function() {
return function(selector, entry) {
    return this.addFutureAction('find scope variable for \'' + selector + '\'', 
        function($window, $document, done) {
            var $ = $window.$; // jQuery inside the iframe
            var elem = $(selector);
            if (!elem.length) {
                return done('No element matched \'' + selector + '\'.');
            }
            var entries = entry.split('.');
            var prop = elem.scope();
            for (var i in entries) {
                prop = prop[entries[i]];
            }
            done(null, prop);
        });
    };
});
于 2013-02-28T05:43:37.457 に答える