2017-01-05 1 views
0

私はkarma/jasmineを使用してアングラサービスをテストしています。私のサービス機能の1つは次のとおりです。私は私が持っている、私の対応.specテストファイルでカルマテストの方法httpbackendを使用して、成功とエラーの両方のケースをテストするRestriction httpコール?

function getAccount(accountId) { 
    var defer = $q.defer(), myService; 
    myService = Restangular.all('Some/Url/Path'); 
    myService.get('', {}, { 
    'header-info': 'bla' 
    }) 
    .then(function onSuccess(response) { 
     defer.resolve(response); 
    }, function onError() { 
     someMethodCall(); 
    }); 
    return defer.promise; 
} 

... 100%にカバレッジを取得する必要がありますが、両方の成功とエラーケースをテストする方法を見つけ出すように見えることはできません。

it('should succeed in getting account', function() { 
    httpBackend.whenGET('Some/Url/Path').respond(200, mockResponse); 
    var promise = myServices.getAccount('account123'); 
    promise.then(function(response) { 
    expect(response).toEqual(mockResponse); 
}); 

it('should error out in getting account', function() { 
    httpBackend.whenGET('Some/Url/Path').respond(500, ''); 
    var promise = myServices.getAccount('account123'); 
    promise.then(function() { 
    expect(someMethodCall).toHaveBeenCalled(); 
}); 

今のところ、どちらのケースも「合格」ですが、onErrorケースのブランチカバレッジを取得できません。 onSuccessのケースも過ぎ去ってしまったことについては何かが怪しいようです。

は基本的に私は、私はあなたドン以来200と私のAPI

答えて

1

から500電話をかけるときに私は成功とエラーケースの両方を打つことができるようなテストケースを書くのが正しい構文と方法が何であるかを求めていますあなたのサービスで$httpへの呼び出しがありません。私はhttpBackendの代わりにRestangularを嘲笑することをお勧めします。このようにして、あなたのテストはRestangularのインプリメンテーションの詳細について、あなたのサービスと同じように、返されるもの以外は知る必要がありません。

モック例:

var Restangular = { 
    all: function() { 
    return { 
     get: function() { 
     restangularDeferred = $q.defer(); 
     return restangularDeferred.promise; 
     } 
    }; 
    } 
}; 

今、あなたは簡単に解決するかテストするものに応じてrestangularDeferredを拒否することができます。私がいることを

it('error', function() { 

    spyOn(anotherService, 'someMethodCall'); 

    var mockResponse = {}; 

    myServices.getAccount('acount123'); 

    restangularDeferred.reject(mockResponse); 

    $rootScope.$digest(); 

    expect(anotherService.someMethodCall).toHaveBeenCalled(); 
}); 

注:

module('myApp', function($provide) { 

    $provide.value('Restangular', Restangular); 
}); 

成功例例のテスト:エラー例

it('success', function() { 

    // If you want you can still spy on the mock 
    spyOn(Restangular, 'all').and.callThrough(); 

    var mockResponse = {}; 

    var promise = myServices.getAccount('account123'); 

    promise.then(function(response) { 

    expect(response).toEqual(mockResponse); 
    expect(Restangular.all).toHaveBeenCalledWith('Some/Url/Path'); 
    }); 

    restangularDeferred.resolve(mockResponse); 

    // Trigger the digest loop and resolution of promise callbacks 
    $rootScope.$digest(); 
}); 

例のテストモックを使用するようにモジュールを設定

この例ではsomeMethodCallanotherServiceに移動しました。

デモ:http://plnkr.co/edit/4JprZPvbN0bYSXFobgmu?p=preview

+0

をありがとう!完全に動作します – noobprogrammer

+0

@noobprogrammerあなたは大歓迎です:) – tasseKATT

関連する問題