ali*_*ali 14 unit-testing factory jasmine angularjs
我对此非常新(angularjs,jasmine,testacular),我有这个代码(我简化了一点,只留下重要的东西):
//my_module.js
angular.module('my_module', ['my_data'])
.config([...]);
.controller('my_controller', ['$scope', 'my_data',
function($scope, my_data) {
$scope.my_function = function() {
return my_data.my_factory.save().then(function () {
console.log('saved');
},
function() {
console.log('Error');
});
}
}
)
//my_data.js
angular.module('my_data', [])
.factory('my_factory', ['$q', '$rootScope',
function($q, $rootScope) {
var my_factory= function(my_data) {
angular.extend(this, my_data);
}
my_factory.prototype.save = function() {
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve();
$rootScope.$apply();
}, 1000);
return deferred.promise;
}
return my_factory;
}
])
Run Code Online (Sandbox Code Playgroud)
所以,我想要做的是测试my_module.my_controller.my_function被触发时是否调用了my_data.my_factory.save.
//my_test.js
describe('testing my_controller.my_function', function () {
beforeEach(module('my_module'));
var $rootScope, $controller;
beforeEach(inject(function(_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
$controller = _$controller_;
}));
scope = $rootScope.$new();
it('should call the save function', function() {
scope.my_function();
expect(my_data.save).toHaveBeenCalled();
});
}
Run Code Online (Sandbox Code Playgroud)
我需要一些帮助.
Cai*_*nha 25
你离你需要的东西不太远.首先,你需要my_data
作为my_module
依赖,你不需要注入 my_module
到控制器,只需要工厂(my_factory
);
其次,您想要使用ngMock.文档不是很完整,但提供了很好的见解.更多这里和这里的例子(寻找test/unit/controllers
).
基本上,你想要做的是模拟服务,这样你就可以确信它已被调用.要实现它,请注入$provide
您的angular.mock.module
电话并提供模拟my_factory
服务.实现它的最佳方法是这样的:
describe('testing my_controller.my_function', function () {
var mockedFactory, $rootScope, $controller;
beforeEach(module('my_module', function($provide) {
mockedFactory = {
save: jasmine.createSpy()
};
$provide.value('my_factory', mockedFactory);
}));
beforeEach(inject(function(_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
$controller = _$controller_;
}));
scope = $rootScope.$new();
it('should call the save function', function() {
scope.my_function();
expect(mockedFactory.save).toHaveBeenCalled();
});
}
Run Code Online (Sandbox Code Playgroud)
这样你就会覆盖my_factory
依赖.
归档时间: |
|
查看次数: |
22572 次 |
最近记录: |