2016-06-01 4 views
1

私はカルマテストランナーとジャスミンテストフレームワークでAngularJSでユニットテストを設定しました。私のコードカバレッジレポートは、私のテストでどのラインと条件がカバーされているかをうまく示しています。このカバレッジレポートでは、私のコードで条件付きのifがテストされていないことがわかりました。 angular.forEach()コールのモックを作成する必要はありますか?もしそうなら、正確にこれを行うには? ngMockで?AngularJSユニットテストで条件付きが呼び出されたかどうかのテスト

ご質問をより明確にするため、angular.forEach()コールでifという条件を使用した例をご提供します。

言ってやる例えば、私は次のサービスがあります。

angular.module('myApp').service('myService', function() { 
    function myFunction(myFunctionParameters) { 

    // ... Some irrelevant code... 

    var x = []; 
    angular.forEach(xObjs, function(o) { 
     if (some condition) { // <--- Code coverage says this is not tested!! 
     // do something... 
     } 
    }); 

    // ... Some more irrelevant code 

    return // Something // 
    } 

    return { 
    myFunction: myFunction 
    }; 
}); 

"MYSERVICE" のためのテストはこのようなものが考えられます。

describe("myService", function() { 
    // Some variables 
    // Declare the mocking variable 
    // Invoke the module 
    beforeEach(module('myApp')); 
    beforeEach(function(){ 
    // Define the mock variable 
    mockVariable = <define mock variable here> 
    module(function($provide) { 
     $provide.value('serviceToMockName', mockVariable); 
    }); 

    // Inject the services 
    inject(function(_myService_) { 
     myService = _myService_; 
    }); 

    // Spy on the mock 
    // Call myFunction function in myService 
    result = myService.myFunction(functionParameters); 
    }); 

    // Write some tests for the myFunction call in myService 
    describe("myFunction", function() { 
    it("should test the if condition...", function() { 
    // How to make sure I did the condition check in the if statement!! 
    }); 
    }); 
}); 

コードカバレッジ緑色で強調表示

をライン21,22および24である。赤で強調表示されている唯一のラインは、ifの条件である23である。したがって、私はif(24行目は緑色で強調表示されているため)と入力していますが、ifの条件自体はカバーされていません。

21 11   var x = []; 
22 11   angular.forEach(xObjs, function(o) { 
23 55   if (o.values.length) { 
24 55    x.push(o.values[o.values.length-1]); 
25    } 
26    }); 

答えて

0

そういうわけではありません。後にif条件で変数を設定することができます。 のように、あなたはあなたのテストでそれが呼び出されているかどうかを確認するために回復することができます。

expect(yourService.getVariable()).toEqual(theValueThatYouExpect); 

先に進むと、あなたの関数内の変数をインクリメントして、何回呼び出されたかを確認することができます。

+0

ありがとうございます。私はあなたの答えを評価しましたが、私はこれが私の問題の解決策ではないと思います。コードカバレッジの例を含めるように質問を編集し、実際のif自体を除いてすべての行がどのように "カバーされている"のかを明確に説明しましたか?何か案は?また、私がこれを考えるのが間違っていれば私を修正してください。私のサービスにコードを追加するのは正しいとは思いません。それは単体テストで使用する変数を数えることだけです。 – effort

+0

本当にこれを特定するには、本当にコードカバレッジが適切です。私は私のプロジェクトでこれを行うためにカルマを使用しています。カバレッジが完了していれば、ラインごとにレポートを提供するので興味深いです:https://www.npmjs.com/package/karma-coverage –

+0

ここに同じです。私は、これを行うためにカルマの範囲を使用し、私のテストを実行するためにgulpを使用します。それでも、私の「if」条件がテストでカバーされているかどうかを確認する方法を見つけることができませんか? – effort

関連する問題