2017-01-05 13 views
0

我正在测试使用karma/jasmine的角度服务,我的一个服务功能如下。我需要得到覆盖率达到100%,但似乎无法弄清楚如何测试成功和错误的情况下..如何Karma测试使用httpbackend测试成功和错误情况下的Restangular 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; 
} 

在我相应的.spec测试文件,我有:

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和500电话到我的API

回答

1

既然你不在您的服务中没有拨打$http的电话,我建议嘲笑Restangular而不是使用httpBackend。这样,您的测试不需要知道任何有关Restangular的实施细节,除了它返回的内容,就像您的服务一样。

模拟例如:

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

现在您可以轻松地解决两种或拒绝restangularDeferred取决于你要测试的。

设置你的模块使用模拟:成功案例

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(); 
}); 

例测试误差情况:

it('error', function() { 

    spyOn(anotherService, 'someMethodCall'); 

    var mockResponse = {}; 

    myServices.getAccount('acount123'); 

    restangularDeferred.reject(mockResponse); 

    $rootScope.$digest(); 

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

注意,我在示例中,将someMethodCall转换为anotherService

演示:http://plnkr.co/edit/4JprZPvbN0bYSXFobgmu?p=preview

+0

谢谢!!完美作品 – noobprogrammer

+0

@noobprogrammer不客气:) – tasseKATT

相关问题