2016-04-29 11 views
0

これは私がテストしたいコードです:JSONファイルに障害が発生したかどうjasmineを使用してjson inside関数をテストするにはどうすればよいですか?

ジャスミンを使用して
function loadNotification(searchOption, searchKey) { 
    var url = '@URLs.API.Notifications.Past' + '?searchOption=' + searchOption + '&searchValue=' + searchKey; 
    $.getJSON(url) 
     .done(function (nData) { 
     //some code here 
     }) 
     .fail(function (jqXHR, status, error) { 
     showError('There was an error while fetching the records. Please try after some time. (' + jqXHR.status + ':' + jqXHR.statusText + ')'); 
     }); 
} 

、どのように私がテストしていますか? .done.failを使用することを考えていましたが、可能かどうかはわかりません。私はjsonについてよく知らない。誰か助けてくれますか?

答えて

0

AJAXリクエスト(と同様に、jsonファイルの取得など)をテストする場合、コードが完了したか失敗するかをチェックできることを常に確認することをお勧めします。また、テストするデータを疑似し、アプリケーション内の実際のエンドポイントやダウンロードしようとするファイルにあまり依存しないようにする必要があります。テストをできるだけ速く動かしたいと思っています。スパイ使っ

:あなたはいくつかのことを行うことができますジャスミンを使用

spyOnが与えられた関数をスタブと、それに渡された引数の種類を追跡できる機能ですが、見ることができます他のどの関数がそれを呼び出し、それが実行されたコードが実行されるときに特定の値を返すことさえできます。

スパイを使用して、$ .getリクエストが行われることを確認してから、特定の値を返すと言うことができ、プログラムのテストを続けることができます。

はジャスミンAjaxのプラグイン

を使用してこれは私が私のテストで使用したいものです。ジャスミンはとてもいいプラグインを持っていますajax.js。 Ajaxの機能を簡単にテストできます。私がしたいのは、実際のリクエストを模擬することです。あなたのコードがファイル/応答を取得しようとすると、コードは実際の呼び出しを無視して、それを模倣し、指定できる偽のデータを返します。

私が開始する前に、私は別の関数で私のajaxメソッドを持っていることを望んでいます。それはただ約束を返します。それはたとえば、あなたはそれが好きで書き換えることができるように、/ /テストを読んで維持するために非常に簡単です:

this.loadNotificationCall = function(searchOption, searchKey) { 
    var url = '@URLs.API.Notifications.Past' + '?searchOption=' + searchOption + '&searchValue=' + searchKey; 
    return $.getJSON(url) 
} 

this.loadNotification() { 
    return this.loadNotificationCall() 
     .done(function (nData) { 
      //some code here 
     }) 
     .fail(function (jqXHR, status, error) { 
      showError('There was an error while fetching the records. Please try after some time. (' + jqXHR.status + ':' + jqXHR.statusText + ')'); 
     }); 
} 

を使用すると、ダミーデータを使用してテストアプリケーションをロードした場合、私はあなたがAJAX要求ファイルが特定のパスを持っていることを期待すると思います。

あなたは

'@URLs.API.Notifications.Past' + '?searchOption=' + searchOption + '&searchValue=' + searchKey; 

からの出力はのは、それを言ってみましょうことができるものの中で最も基本的な、デフォルトのバージョンを見ているURLが正確に何でしょう、あなたのアプリケーションに一致させる必要があること

//'someapi?searchOption=1&searchValue=abc' 

のようなものです接触しようとします。あなたのデバッグ/フィドラーをチェックしてください。一致しない場合(送信しようとしているデータを含む)、モックは失敗し、テストはタイムアウトします。エラーは通常、あなたはそれが権利を取得したら、あなたは次の例では、そのURLを模擬することができますTimeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

次のようになります。

describe('when user gets the data', function() { 

var sut = null; 
var testCall = null; 
var dummyData = { 
    name: 'Jon Snow' 
}; 
beforeEach(function() { 
    jasmine.Ajax.install(); 
    jasmine.Ajax.stubRequest("someapi?searchOption=1&searchValue=abc").andReturn({ 
      responseText: JSON.stringify(dummyData) 
    }); 

    sut = new yourApplication(); 
    testCall = sut.loadNotification(); 
}); 

afterEach(function() { 
    jasmine.Ajax.uninstall(); 
}); 

// actual tests here 

}); 

私は、またあなたがそれらのモックのURLにワイルドカードを使用できることをかなり確信しています​​

だから、$ .getであなたのメソッドを呼び出す何かをテストすると、リクエストはあなたのサーバーには起こりませんが、代わりにそれが侮られ、私たちのダミーデータが返されます。それがされるまで終了しないように、

it('should populate name', function(done) { 
    testCall 
     .done(function() { 
      expect(sut.name).toEqual('Jon Snow'); 
      done(); 
     }); 
}); 

あなたがテストを行って引数を渡す:この例では、それはあなたがこのようになりますテストをしたい、今すぐname: 'Jon Snow'

との単純なオブジェクトですコールは終了します。ブラウザでそれをデバッグすると、ファイル内のコードが完了したメソッドの中に入り、実際のリクエストと同じように作業を続けることがわかります。 done(nData)のデータはname: Jon Snowというダミーオブジェクトになります。

あなたが失敗したコードをテストしたい場合は、AJAXプラグインにいくつかの追加設定を追加することができます

jasmine.Ajax.stubRequest("someapi?searchOption=1&searchValue=abc").andReturn({ 
    status: 500, 
    responseText: "{}" 
}); 

私はこれだけであなたを退屈しませんでした、私はsimplier方法が(そこにあることを知っている願っています「ajax」で$ .spyを実行して最新のコールなどを表示するなど、私の方法が好きで、うまくいきました。複数コール、チェーンコール、さらに多くのクールシナリオをテストできます。

+0

ありがとう@kasperooの詳細な返信のために私は先に進み、私のテストでそれらを試してみることに感謝します!うまくいけば、私はそれを働かせることができます –

+0

私は機能を変更することができない場合(別の開発者がプロ​​グラムした)AJAX呼び出しを使用すると、上に示したコードを使って偽装することができますか? –

+0

正しいと約束が返されたと仮定すると、 – kasperoo

関連する問題