AngularJS使用其进行嵌套调用的依赖服务测试控制器。我被卡在使用Sinon存根上了

AngularJS使用其进行嵌套调用的依赖服务测试控制器。我被卡在使用Sinon存根上了,angularjs,unit-testing,jasmine,sinon,Angularjs,Unit Testing,Jasmine,Sinon,我不熟悉AngularJS,当然也不熟悉JS测试。我被困在如何测试角度控制器内部驱动的数据。我了解到,sinon可以存根到类似服务的函数调用,以获取假数据。我还了解到Angular有$provide。。。但由于我是新手,我迷路了。所以我想征求你们的意见,我做错了什么,下一步我应该做什么才能为我的Angular应用程序正确编写JS测试 控制器 (function () { 'use strict'; var controllerId = 'appCtrl'; angul

我不熟悉AngularJS,当然也不熟悉JS测试。我被困在如何测试角度控制器内部驱动的数据。我了解到,sinon可以存根到类似服务的函数调用,以获取假数据。我还了解到Angular有$provide。。。但由于我是新手,我迷路了。所以我想征求你们的意见,我做错了什么,下一步我应该做什么才能为我的Angular应用程序正确编写JS测试

控制器

(function () {
    'use strict';

    var controllerId = 'appCtrl';

    angular.module('app').controller(controllerId,
        ['common', 'datacontext', appCtrlFn]);

    function appCtrlFn(common, datacontext) {

        var vm = this;
        vm.title = 'My Title';
        vm.allFooData = [];
        vm.count = 0;

        activate();

        function activate() {
            common.activateController([getAllFooData()], controllerId)
                .then(function () { log('Activated.'); });
        }

        function getAllFooData(forceRefresh) {
            return datacontext.allFooData.getAll(...)
                .then(function (data) {

                    vm.allFooData = data;

                    getCount();

                    return data;
                }
            );
        }

        function getCount() {
            return datacontext.allFooData.getCount()
               .then(function (num) {
                   return vm.count = num;
            });
        }
    }
})();
实际上,datacontext.allFooData是Foo的角度服务

(function () {
    'use strict';

     var serviceId = 'repository.foo';

     angular.module('app').factory(serviceId,
         [fooRepositoryFn]);

     function fooRepositoryFn() {

         function ctor() {

             this.getAllFooData = getAllFooData;
             this.getCount = getCount;
         }

         return ctor;

         function getAllFooData() {

             return [
                 {
                     "id": 1,
                     "name": "foo1",
                 },
                 {
                     "id": 2,
                     "name": "foo2",
                 },
                 {
                     "id": 3,
                     "name": "foo3",
                 },
             ];
         }

         function getCount() {

             return 3;
         }
     }
})();
我的测试代码

describe("Controller Tests", function () {

    var controller,
        controllerName = 'appCtrl',
        service,
        serviceName = 'repository.foo';

    beforeEach(function() {

        // Load app module
        module('app');

        inject(function($injector) {

            // Get the controller
            controller = $injector.get('$controller')(controllerName);

            // Get the service
            service = $injector.get(serviceName);
        });
    });

describe("Test case 1", function() {

        it("Should be created", function() {

            expect(controller).toBeDefined(); // PASSED
        });

        it("Should have title", function() {

            expect(controller.title).toEqual('My Title'); // PASSED
        });
    });

    describe("Repository Test", function() {

        it("Should be defined", function() {

            expect(service).toBeDefined(); // PASSED
        });

        it("Should get data", function () {

            // Stub the 'getCount' function from the service (is it internal)?
            sinon.stub(service, 'getCount', function () { // ERROR

                // I don't want to touch the real data, so I created a fake
                var count = fooDataMock.getAllFooData().length; // returns 1
                return count;
            });

            expect(service.getCount).toEqual(1); // FAILED
        });
    });
})
这是错误信息

TypeError: Attempted to wrap undefined property getCount as function
    at Object.wrapMethod (http://localhost:9876/base/Scripts/sinon-1.11.0.js:739:25)
    at Object.stub (http://localhost:9876/base/Scripts/sinon-1.11.0.js:2539:26)
    at null.<anonymous> (http://localhost:9876/base/app/tests/foo/foo.spec.js:70:19)
    at jasmine.Block.execute (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:1145:17)
    at jasmine.Queue.next_ (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:2177:31)
    at jasmine.Queue.start (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:2130:8)
    at jasmine.Spec.execute (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:2458:14)
    at jasmine.Queue.next_ (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:2177:31)
    at jasmine.Queue.start (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:2130:8)
    at jasmine.Suite.execute (http://localhost:9876/absolute.../npm/node_modules/karma-jasmine/lib/jasmine.js:2604:14)
使用ctor对象和函数调用:

expect(service.ctor.getCount()).toEqual(1)