2016-04-12 9 views
1

純粋なJavascriptモデルをカプセル化する角度サービスを想定しましょう。これは、promise resolveを使って受け取ったのと同じパラメータを返す単純な非同期メソッドを持っています(デモ用)。コンストラクタメソッド内で発生する角度プロミスコールバックではなく、オブジェクトリテラルメソッドで発生する

angular.module('app', []) 
    .factory('MyModel', ['$q', function ($q) { 
    function MyModelConstructor() { 
     this.test = function(myParam) { 
     var deferred = $q.defer(); 
     if (myParam) { 
      // Not triggering then callback 
      deferred.resolve(myParam); 
     } 
     return deferred.promise; 
     } 
    } 

    return MyModelConstructor; 
    }]); 

テストメソッドを呼び出した後、コールバックはトリガされません。しかし、私はコンストラクタによって作成されたオブジェクトリテラルとして試験方法を添付した場合、すべてが正常に動作します:

it('should not fail!!!', function() { 
    myModelExample = new MyModel(); 
    var result; 
    expect(result).toBeUndefined(); 
    myModelExample.test(111).then(function(funresult) { 
    result = funesult; 
    }); 
    $rootScope.$apply(); 
    expect(result).toBe(111); // But it fails 
}); 

it('should have working promise', function() { 
    myModelExample = new MyModel(); 
    var result; 
    expect(result).toBeUndefined(); 
    myModelExample.test = function(myParam) { 
    var deferred = $q.defer(); 
     if (myParam) { 
     deferred.resolve(myParam); 
     } 
     return deferred.promise; 
    } 
    myModelExample.test(111).then(function(funresult) { 
    result = funresult; 
    }); 
    $rootScope.$apply(); 
    expect(result).toBe(111); // This way does not fail 
}); 

コンストラクタ作成方法とリテラル1間のコールバックをトリガするという点で違いは何ですか?コンストラクタに添付されたテストメソッドは、どのようにコールバックをトリガできますか? 、そう

myModelExample = new MyModel(); 

Plnkrタイプミス

result = funesult; 

そして、あなたは、テスト内myModelExampleを定義していない:

Here is a Plunker with the example

+0

どのように 'test'メソッドを呼び出すのですか?その議論は真実ですか? 'deferred.resolve(myParam);'文が実行されていますか? – georgeawg

答えて

1

あなたは間違った二つのものを持っているhttp://plnkr.co/edit/YdsuoJMkrccPjMb3e2jC?p=preview

+0

問題は、テストする要素ごとにモデルを作成しなければならなかったことです。だから、すぐ前にそれぞれのブロックに追加され、それが動作します。 ありがとうございます! 私のPlunkerを編集しました – xpander001

1

あなたはの中でテストするべきですが解雇されました。 .then$rootScope.apply()

it('should not fail but it fails!!!', function() { 
    var result; 
    myModelExample = new MyModel(); 
    expect(result).toBeUndefined(); 

    myModelExample.test(111).then(function(funresult) { 
     result = funresult; 
     expect(result).toBe(111); // NOPE :(
    }); 

    $rootScope.$apply(); 

    }); 

に解雇されPlnkr:ここhttp://plnkr.co/edit/UWBvHorznTdPHrsxA2Hb?p=preview

+0

あなたがplunkerでそれを行うと、これは実際に問題を解決しません。 'myModelExample.test()' promiseが返さない – tyler

+0

@tyler updated answer。 'expect(result).toBe(111);'を 'expected(result).toBe(112);に変更してテストできますが、これは期待通りに失敗します。 – mani

+1

そこに行く... 'expect'は約束のコールバックの中にあり、' apply'は 'it'ブロックの最後にあるべきです。 –

-1

が作業plunkerです:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview

1)MyModelは、テストでインスタンス化されていませんでした。 2)$rootScope.$applyexpectは、約束のコールバックの中にあるべきです。

+0

これは実際にはテストを実行していません。 'expect'の111から112に変更しても、それはそのまま渡されます – tyler

+0

コールバックの内部にexpectを置くと、決して実行されないので、それが動作します。失敗した期待は決して実行されません。 – xpander001

+0

私の回答の問題は、 'rootScope。$ apply'がコールバックにあることです。実生活のシナリオでは、約束が(著者のコードのように)直ちに解決されない可能性があるため、コールバックで 'expect'が発生するはずです。約束が直ちに解決されず、 'expect'がコールバックの外側にある場合、' result = funresult'が設定される前に 'expect'が呼び出されます。 –

関連する問題