0

角度単位テストの学習を始めました。ただし、http呼び出しの関数に対するこのテストは失敗します。私はピンが問題を指摘しているが、私はそれを修正することができていない。私はそれはいくつかの簡単な問題ジャスミン角度単位テスト '未定義の'プロパティを読み取ることができません

コントローラの知っている

//Get data from URL 
vm.getJson = function() { 
    var url = 'https://www.reddit.com/r/worldnews/new.json', 
     count = 0; 
    $http.get(url).success(function(response) { 
     console.log(response); 
     for (var i = 0; i < response.data.children.length; i++) { 
      vm.data.push(response.data.children[i].data); 
      count++; 
      if (count === response.data.children.length) { 
       vm.numberOfPages(); 
      } 
     } 

     vm.result = true; 

    }).error(function(err) { 
     console.log(err); 
    }); 

}; 

私は取得しています応答は次のとおりです。 enter image description here

スペック

//Testing the getJson function 
describe('vm.getJson()', function() { 

    it('It should return dummy Data as response and vm.result to be truthy', function() { 

    var dummyData = {name: 'Umair'}; 
    $httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData); 

    MainCtrl.getJson(); 

    $httpBackend.flush(); 

    expect(MainCtrl.result).toBeTruthy(); 


}); }); 

私はすべてのエラーを得ることはありません私がループをcから取り除くとテストに合格しますontroller機能です。私が得るエラーは次のとおりです。

未定義の「子供」は読み取れません。応答データを添付した画像から、子は配列です。あなたダミーデータが配列でない

答えて

1

テストを実行すると、$ httpBackend実際$http.get呼び出しをインターセプトし、あなたが

に示されているように応答する dummyDataを割り当てます
$httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData); 

この模擬動作により、テストマシンから到達可能な赤信号に頼らずに素早くユニットテストを完了することができます。だからあなたのコントローラでresponse.data = {name: 'Umair'}とそのオブジェクトは、childrenという名前の子がありません。

これを修正するには、dummyDataの場合、実際のデータをもう少し模倣してみてください。

+0

ありがとうございます。私は実際のデータを模倣しようとしましたが、これは他の答えと同じです。ありがとうございました。しかし、私はまだあなたが何を意味するのか混乱しています。「この嘲笑的な振る舞いによって、あなたのユニットテストは信頼できないまま完了することができますか?それはどのように機能するのですか? –

+0

このテスト段階に入る前に、テストフレームワークをセットアップし、「角モック」と呼ばれるものを組み込む必要がありました。 $ httpBackendには、$ http呼び出しを傍受して模擬データ(dummyDataなど)を使用するという考えがあります。ユニットテストの目的は、いくつかのサンプル入力を渡し、特定の出力/動作を期待することによって、1つの単一機能のような小さなコードをテストすることです。黙っているだけでそれをすることができます。テストが失敗した場合は、関数にエラーが導入されていることがわかり、redditやネットワーク接続とは何の関係もありません。 – lastoneisbearfood

+0

ええ、大丈夫です。それを答えとして受け入れるつもりです。しかし、最後の1つの質問、私が作成したモック、それは元のデータと一致する必要がありますか?元のレスポンスのように、プロパティの子供がいて、モックで同じプロパティキーを追加する必要がありますか? –

0

、私はこの問題を解決することができたとし、テスト

//Testing the getJson function 
describe('vm.getJson()', function() { 

    it('It should return dummy Data as response and vm.result to be truthy', function() { 

     var dummyData = [{ data: 'Umair' }]; 
     $httpBackend 
      .when('GET', 'https://www.reddit.com/r/worldnews/new.json') 
      .respond(.respond(
       function() { 
        return [200, dummyData, {}]; 
       });); 

     MainCtrl.getJson(); 

     $httpBackend.flush(); 

     expect(MainCtrl.result).toBeTruthy(); 

    }); 
}); 
+0

私はそれを試みました。同じ問題があります。 –

1

の下にあなたのテストで財産nameを持つオブジェクトを返しているし、あなたがしようとしているとしてみてください未定義のプロパティdataにアクセスします。

あなたは例えば、あなたのテストで実際のレスポンスオブジェクトをシミュレートする必要があります

var dummyData = { 
    data: { 
    children: [ 
    { data: 'foo'} 
    ] 
    } 
}; 
+0

ありがとうございました。しかし、私はまだ混乱しています。どのように問題があったのか、それがどのように修正されたのか分かりません。あなたは詳細を教えていただけますか? –

+0

'whenRoute'を使って、' $ httpBackend'が提供されたURL(つまりhttps://www.reddit.com/...)にGETして返すものを定義していれば、 (https://docs.angularjs.org/api/ngMock/service/$httpBackend)、よく文書化されています –

+0

ありがとうございます。それはexpectGETと同じように動作しますか? –

関連する問題