2017-07-19 1 views
0

私は私の角度コントローラで、以下の機能を持っているとの約束が期待された結果関数の内部で呼ばれるカルマのユニットテストでの約束を模擬する方法

function getName() { 
     var name = ""; 
     nameService.getName().then(function (data) { 
     name = data.name; 
     }); 
     return name; 
    } 

を返した場合、私は約束を模擬することができますどのように、テストしたいです偽のデータで電話しますか?私は$ httpBackendを使うことができるか$をここで提供できるのかどうか分からないのですか?私はこれを試してみましたが、それはうまくいきませんでした:

spyOn(mockNameService, 'getNameInfo').and.returns($q.when('dummyData')); 

をあなたのデータを模擬する:

it("function getName should get the name from the nameService.getNameInfo function", function() { 
     var name = { name: "name1"}; 
     spyOn(mockNameService, 'getNameInfo').and.callFake(function() { 
      return { 
       then: function(callback) {return callback(name);} 
      }; 
     }); 
     var result = myCtrl.getName(); 
     expect(result).toEqual("name1"); 
    }); 
+0

あなたはサイロンスタブ/スパイを使っていますか? –

+0

@KoushikChatterjee:単体テストでコードを更新しました(まだ動作していません) – YourReflection

答えて

0

を使用してみてください。 それが解決したら、確認する必要があります。したがって、次のように書いてください:

expect(myCtrl.getName().then(function(name){ 
    expect(name).toBe('dummyData'); 
}).toBeResolved(); 
+0

Thanx @naveenAttriしかし動作しません。私はまだ何かが欠けているかどうかはわかりません。 'TypeError:undefinedはコンストラクタではありません( 'spyOn(mockNameService、' getNameInfo ')、and.returns($ q.when(' dummyData '))')')を評価します。私はbeforeEachに '$ q'を注入し、そこに次の代入をしています:' $ q = _ $ q_; ' – YourReflection

0

問題はあなたのユニットテストコードではなく、すべてのアプリケーションコードで間違った実装です。ここ :このコード機能getName

function getName() { 
     var name = ""; 
     nameService.getName().then(function (data) { 
     name = data.name; 
     }); 
     return name; //it will return "" because the promise yet not resolved 
    } 

は常に空の文字列""を返し、約束はname = data.nameを解決するときの約束が非同期であるため、時間によって、その機能を解決するためには、あなたが代入されている値を返すことはありませんgetNameは既に空の文字列を呼び出し側に返しました! この場合、元のコードをリファクタリングしてそこに修正するのが最初のアイデアです!

実際にあなたのユニットテストコードはあなたのコードのバグを特定しているので、テストケースが失敗しているということは、テストケースが完全に書かれているのではなく、実際のコードを見て、実際のコードを見て、なぜそれが失敗しているのかを考えなければならないすべての可能なユニット/モジュールの論理的な期待

+0

うーん、コードをデバッグするとうまくいきます。 – YourReflection

関連する問題