【问题标题】:Testing repsonse of angular service with $http get使用 $http get 测试角度服务的响应
【发布时间】:2013-08-06 07:51:03
【问题描述】:

我对 AngularJS 和测试很陌生,所以我试图测试我在 AngularJS 中制作的服务。

我已经设置了这样的服务

var serviceModule = angular.module('App.services', []);
serviceModule.factory('subscribeService', function ($http) {
    return {
        getNumberOfSubscribers : function() {
            return $http.get('/jsonFiles/subscribers.json')
                .then(function(subscribers) {
                     return subscribers.length;
                });
        }
    };
});

测试是这样进行的。

describe('Subscribe service test', function() {
var httpBackend,
    subscribeServiceMock, 
    subscribers;

subscribers = [{"email": "test1@mail.com", "subscriptions": "A,B,C"},
               {"email": "test2@mail.com", "subscriptions": "A,C,D"},
               {"email": "test3@mail.com", "subscriptions": "B,C,F"}];

beforeEach(module('App.services'));     

beforeEach(inject(function(subscribeService){
    subscribeServiceMock = subscribeService;
}));

it('Should return total numbers of subsribers', inject(function ($httpBackend) {
    $httpBackend.whenGET('/jsonFiles/subscribers.json').respond(subscribers);
    var numberOfSubscribers = subscribeServiceMock.getNumberOfSubscribers();
    $httpBackend.flush();
    expect(numberOfSubscribers).toEqual(3);

}));

测试接缝失败并出现此错误: “订阅服务测试应该返回失败的订阅者总数” " 期望 { then : Function } 等于 3"

我想知道我哪里弄错了?

【问题讨论】:

    标签: javascript unit-testing angularjs jasmine


    【解决方案1】:

    您是否尝试过注入您的 httpBackend?在你的“beforeEach”调用上试试这个:

    beforeEach(inject(function(subscribeService, _$controller_, _$rootScope_, _$httpBackend_){
        subscribeServiceMock = subscribeService;
        $scope = _$rootScope_.$new();
        $controller = _$controller_('MyCtrl', { $scope: $scope });
        $httpBackend = _$httpBackend_;
    }));
    

    更新

    我在这里发现:AngularJS Issues mocking httpGET request

    看来这两种“注入法”其实是有区别的

    【讨论】:

    • 在每次之前注入它或在测试中注入它自己有什么区别吗?
    • 唯一的区别是,对于您在测试中的每个“it”子句,beforeEach 都会被调用一次...如果您有 6 个测试用例,您可以在 beforeEach 中编写一次并让它运行所有这些
    • 但我已经在测试中注入了 httpBackend。应该没什么区别
    • 你是对的,它不会有任何区别。当我第一次阅读你的问题时,我似乎没有引起足够的重视,抱歉。看看这是否可以帮助你:stackoverflow.com/questions/14766051/…
    猜你喜欢
    • 2019-05-29
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多