如何使用jasmine和angular-mocks测试$ http而不用mock?

时间:2015-05-11 18:01:20

标签: angularjs jasmine angularjs-http

我想对我的服务器进行真正的调用进行集成测试,因此,我不想使用angular-mocks的$ httpBackend模块,所以我试试这个:

beforeEach(inject(function($rootScope,_MembersDataSvc_){
    service = _MembersDataSvc_;
}));

it('test',function(done){
    service.me().then(function(){done();});
});

服务是:

function me() {
      return $http
        .get('urlBase/me')
        .then(meSuccess);

        function meSuccess(response) {
            return response.data.members[0];
        }
    }

这永远不会调用$ http,似乎angular-mocks覆盖了从未拨打过电话的$ http服务。

一些想法?

编辑1:

根据这篇文章:http://base2.io/2013/10/29/conditionally-mock-http-backend/

你可以为那些你不想模拟的$ http调用做一个passThrough,所以你试试这个:

var service;
    var scope;
    var $httpBackend;

    beforeEach(inject(function($rootScope,_MembersDataSvc_,_$httpBackend_){
        service = _MembersDataSvc_;
        scope = $rootScope.$new();
        $httpBackend = _$httpBackend_;
    }));

it('test',function(done){
        //this.timeout(10000);
        $httpBackend.whenGET(/views\/\w+.*/).passThrough();
        $httpBackend.whenGET(/^\w+.*/).passThrough();
        $httpBackend.whenPOST(/^\w+.*/).passThrough();
        service.me().then(function(response){console.log(response);done();});
        scope.$apply();
        //service.getDevices(member).then(function(response){console.log(response);done();})
    });

但是passThrough在这里是未定义的。

编辑2:

我读过这篇文章:http://blog.xebia.com/2014/03/08/angularjs-e2e-testing-using-ngmocke2e/,但是我认为这是一个独立的测试?我想和karma和jasmine一起运行。

这是我的全部考试。

describe('integration test', function () {

    beforeEach(function () {
        module('MyAngularApp');
    });

    var service;
    var scope;
    var $httpBackend;

    beforeEach(inject(function($rootScope,_MembersDataSvc_,_$httpBackend_){
        service = _MembersDataSvc_;
        scope = $rootScope.$new();
        $httpBackend = _$httpBackend_;
    }));

    it('test for test',function(done){
        $httpBackend.whenGET(/views\/\w+.*/).passThrough();
        $httpBackend.whenGET(/^\w+.*/).passThrough();
        $httpBackend.whenPOST(/^\w+.*/).passThrough();
        service.me().then(function(response){console.log(response);done();});
        scope.$apply();
    });
});

1 个答案:

答案 0 :(得分:0)

我建议使用允许连接到真实后端的ngMidwayTester,我用它来在代码级别进行集成测试 - 所以在单元和e2e测试之间进行了一些测试:

Two types of tests in AngularJS (plus one more) - Full-Spectrum Testing with AngularJS and Karma