2017-10-20 8 views
3

は、私は、コードのこの部分が含まれている方法にユニットテストを書いています:ジャスミンを使って連鎖約束を模擬する方法は?

Name.get($scope.nameId).then(function(name){ 
    Return name; 
}).then(doSomething); 

function doSomething(name)はこのようになります。

function doSomething(name){ 
    addNametoList(name); 
} 

私はコードのこの部分をテストする必要はありません。私はテストでそれを無視できないので(または私はできますか?)、私はそれを嘲笑する必要があります。私が最初に約束

spyOn(mockName, 'get').and.returnValues($q.resolve({"Mike"})); 

を嘲笑し、それが第二then(doSomething)を介して伝播だろうが、nameが機能addNametoListundefinedであると考えました。

私はモックdoSomethingも模倣しなければならないと思いますが、どうやってそれらをつなぎ合わせるか分かりません。

+0

あなたはエラーを受け入れていますか?大文字の 'Return'は私にとって誤植のようです。それはどのように解決しましたか?あなたはジャスミンテストの終わりに約束を返しますか? – Icepickle

+0

さて、コードにいくつかのタイプミスがあることに気付きました。デバッグの2日後に、私は$ q.resolve()の中にオブジェクトを正しく設定しなかったため、最終的にそれを見つけました。それ以外に、最初の約束を嘲笑することは第2の '.then(doSomething)'に伝播します。答える時間をとってくれてありがとう。 – CiCi

+0

あなたには、誤字があります。 - and.returnValues' ...代わりに 'and.returnValue'を使用するべきではありませんか? **編集:** Nevermind、申し訳ありません、最新のジャスミン版には 'returnValues'が存在します... – plamut

答えて

0

あなたの(部分)コントローラコード

$scope.list = []; 

function addNameToList(name) { 
    $scope.list.push(name); 
} 

function doSomething(name){ 
    addNametoList(name); 
} 

$scope.functionToTest = function() { 
    Name.get($scope.nameId).then(function(name){ 
    return name; 
    }).then(doSomething); 
}; 

を無視

it('should add the name to the list when Name.get() is resolved', function() { 
    // Arrange 
    var getDeferred = $q.defer(); 
    spyOn(mockName, 'get').and.returnValue(getDeferred.promise); 

    // Act 
    $scope.functionToTest(); 
    getDeferred.resolve('some name that should be in the list'); 
    $scope.$apply(); 

    // Assert 
    expect($scope.list).toEqual(['some name that should be in the list']); 
}); 

コメント

コードの次の部分は何も実行せず、何も影響を与えずに削除できることに注意してください。

.then(function(name){ 
    return name; 
}) 
0

私はコードのこの部分をテストする必要はありません。私はちょうど それを無視することはできませんので、私はそれを試して(または私?)、私はそれを嘲笑する必要があります。私は最初に 約束を嘲笑しました

IMO、このような設定を全体としてテストする必要はありません。 各ユニットを個別にテストします。

A =() => { 
    ... 
} 

B =() => { 
    ... 
} 

C =() => { 
    ... 
} 

例えば

今、私たちは私たちは、Fをテストすることができ、それが必要になります

F =() => A(B(C)) 

それとも、あなたのケースで

F =() => A().then(B).then(C) 

AB & Cを呼び出すFを、持っていますいくつかのセットアップ、そして壊れやすい。 そのより良いテストする、B &(Fための適切な被覆量で与える)Cとは、テストF.

関連する問題