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