如何测试角度服务函数嵌套承诺?

时间:2017-06-01 00:52:16

标签: javascript angularjs testing jasmine karma-runner

看看我的服务类似于什么

TestService.initializeDefaults = function() {
        var qPromise = $q.defer();
        $q.all({localResource : localResource.fetch(),
                item : itemResource.fetch()}).then(function(directories){

            //stuff happens with directories
            $q.all({
                thing1 : anotherThingFetch.fetch(),
                thing2: someThingFetch.fetch(),
                thing3: thingFetch.fetch()
            }).then(function(funData) {
                //stuff happens with the data

                preventiveServicesService.fetch().then(function() {

                    //stuff happens
                });

            });
        }.bind(this));
        return qPromise;
    };

我尝试使用业力来测试此initializeDefaults方法中的所有函数是否已运行。这意味着基本上所有的提取都发生了。以下是迄今为止我在测试中工作的内容:

it("should initialize defaults (Scenario 1)", function() {

            service.initializeDefaults();

            rootScope.$apply();

            expect(localResourceMock.fetch).toHaveBeenCalledWith();
            expect(itemResourceMock.fetch).toHaveBeenCalledWith();

1 个答案:

答案 0 :(得分:0)

有两种方法你可以解决这个问题。

1)使用$ httpBackend:使用类似于$ httpBackend.expectGET(' url1')。响应(200,{})等依赖于您正在制作的所有$ http calss。然后调用$ httpBackend.flush(),它也应该执行所有嵌套的promises。 下行:这将执行被调用方法中的所有逻辑。

2)使用Jasmine间谍:做类似的事情:

let deferred = $q.defer();
deferred.resolve(/*data you expect the promise to return*/); 
spyOn(localResourceMock, 'fetch').and.returnValue(deferred.promise);
spyOn(itemResource, 'fetch').and.returnValue(deferred.promise);

spyOn(anotherThingFetch, 'fetch').and.returnValue(deferred.promise);
/*And so on for all methods being invoked*/

// Invoke the method
service.initializeDefaults();

// Trigger digest cycle
rootScope.$digest();

/*Expect all the spies to have been called*/
expect(anotherThingFetch.fetch).toHaveBeenCalledWith(); // will now pass

其中任何一个都可行。你的来电。 欢呼声。