0

我想对 angularjs 服务进行 e2e 测试,而不模拟 $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);
        })
    });
4

1 回答 1

0

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

如果您决定尝试 ngMockE2E,请记住它不处理异步/承诺响应。

例如,如果您的模拟响应是一个承诺,它将不起作用。诸如访问数据库或使用 WebSQL / IndexedDB(或其他内存数据库)之类的实例将不起作用。

我开发了一个名为angular-mocks-async的 angular 插件来解决它。这是一个模拟示例:

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;

    });

}]);
于 2016-09-14T20:35:51.160 回答