测试Async $http真实调用angularjs

Test Async $http real calls for angularjs

本文关键字:调用 angularjs 真实 http Async 测试      更新时间:2023-09-26

我想对一个angularjs服务做一个端到端测试,但不模拟$http调用。调用fsSvc。getSubject导致多个内嵌的异步调用,最终以调用回调函数结束,我已经把调用完成了。

不确定这不工作-不应该$http使真正的调用,如果它不是嘲笑?:

 it('should pass auth', function(done) {
        inject(function (fsSvc) {
            var cb = sinon.spy();
            stubs.updateRecord = sinon.stub(dataSvc, 'updateRecord');
            dataSvc.LO.famSrch.access_token_expires = false;
            fsSvc.getSubject("abc", function(err, data) {
                console.log("err:" + err);
                done();
                cb();
            });
            $timeout.flush();
            expect(dataSvc.LO.famSrch.discovery).to.not.be.undefined;
            expect(dataSvc.LO.famSrch.discovery.links).to.not.be.undefined;
            expect(dataSvc.LO.famSrch.access_token).to.not.be.undefined;
            expect(dataSvc.LO.famSrch.username).to.equal("test");
            expect(dataSvc.LO.famSrch.password).to.equal(btoa("test"));
            expect(dataSvc.LO.famSrch.access_token_expires).to.be.greaterThan(3600000);
            expect(stubs.updateRecord.callCount).to.equal(1);
            expect(stubs.updateRecord.args[0][1]).to.equal("localOption");
            expect(cb.callCount).to.equal(1);
        })
    });

我不认为包含e2e有任何问题。这对你来说有什么问题?

如果你决定给ngMockE2E一个尝试,请记住,它不处理async/promise响应。

例如,如果你的模拟响应是一个承诺,它将不起作用。像去DB或使用WebSQL/IndexedDB(或其他内存DB)这样的实例将不起作用。

我已经开发了一个叫做angular-mock -async的angular插件来解决这个问题。下面是一个mock示例:
var app = ng.module( 'mockApp', [
    'ngMockE2E',
    'ngMockE2EAsync'
]);
app.run( [ '$httpBackend', '$q', function( $httpBackend, $q ) {
    $httpBackend.whenAsync(
        'GET',
        new RegExp( 'http://api.example.com/user/.+$' )
    ).respond( function( method, url, data, config ) {
        var re = /.*'/user'/('w+)/;
        var userId = parseInt(url.replace(re, '$1'), 10);
        var response = $q.defer();
        setTimeout( function() {
            var data = {
                userId: userId
            };
            response.resolve( [ 200, "mock response", data ] );
        }, 1000 );
        return response.promise;
    });
}]);