使用$ q.all进行多次服务调用的Angular Unit Testing Service

时间:2015-06-04 14:27:10

标签: angularjs unit-testing jasmine

好的,我们正在尝试使用Jasmine进行单元测试。我们的服务定义与以下服务类似:

(function () {

    'use strict';

    angular.module('mymodule')
           .service('myservice', myservice);

    myservice.$inject = ['$q', '$resource', 'progressService', 
            'myservice2', 'myservice3', 'ngDialog'];
    function myservice($q, $resource, progressService, 
            myservice2, myservice3, ngDialog) {

        var self = this;
        self.dataListSvc2 = [];
        self.dataListSvc3 = [];
        self.dataFromResource = null;
        self.myRoutine = myRoutine;

        var myResource = $resource('/someurl/webapi/GetData');

        //TRYING TO TEST THIS ROUTINE!!!
        function myRoutine(param1, param2) {

            return progressService.show($q.all([
                myResource.get({ Param1: param1 }).$promise.then(function (response) {
                    self.dataFromResource = response;
                }),
                myRoutine2(param2),
                myRoutine3(param2)
            ]));

        }

        function myRoutine2(param) {

            return myservice2.getSomeData(param).then(function (response) {
                var results = [];
                self.dataListSvc2 = [];

                response.forEach(function (item) {
                    item.AddField1 = null;
                    item.AddField2 = false;
                    results.push(item);
                });

                self.dataListSvc2 = results;
            });

        }

        function myRoutine3(param) {

            return myservice3.getSomeMoreData(param, [6])
                .then(function (response) {
                    self.dataListSvc3 = response;
                });
        }
     }
})();

我正在尝试为myservice.myRoutine()写一个单元测试而没有任何运气,我怀疑这是由于$ q.all数组的承诺。这是我确定的一个测试,但它并不理想,老实说,我不觉得它正在测试任何有价值的东西。我还尝试使用$ httpBackend“嘲笑”三个请求而没有运气,因为所有三个响应都返回到具有未定义值的数组中。我搜索了SO和网络,我只发现$ q.all([])单元测试引用控制器而不是服务。如果有人有一些意见,我将不胜感激。这是我暂时安顿下来的地方:

describe('My Service: ', function () {

       var $httpBackend;

        beforeEach(module('mymodule'));

        beforeEach(inject(function ($injector) {
            // Set up the mock http service responses
            $httpBackend = $injector.get('$httpBackend');
        }));

        it('Can call myroutine from myservice', inject(function (myservice) {

            //Arrange
            var expectedVal1 = 1234;
            var expectedVal2 = 1234;

            spyOn(myservice, "myRoutine");

            //Act
            myservice.myRoutine(expectedVal1, expectedVal2);

            //Assert
            expect(myservice.myRoutine).toHaveBeenCalled();

        }));
});

1 个答案:

答案 0 :(得分:0)

使用Wikipedia伪造http请求。你也应该伪造if (c>='0' && c<='9') ++ndigit[c-'0']; 方法和myservice2.getSomeData我猜这些方法也会创建http请求,所以你可以用同样的方式伪造它们。

myservice3.getSomeMoreData

与您手动调用无关;-)。

expect(myservice.myRoutine).toHaveBeenCalled();