var $scope, $state, DTColumnBuilder, DTOptionsBuilder, createController, $httpBackend;
beforeEach(function () {
DTColumnBuilder = {};
DTOptionsBuilder = {};
$state = {};
$httpBackend = {};
module('app', function ($provide) {
$provide.value('$state', $state);
$provide.value('$httpBackend', $httpBackend);
$provide.value('DTColumnBuilder', DTColumnBuilder);
$provide.value('DTOptionsBuilder', DTOptionsBuilder);
});
inject(function ($controller, $injector) {
$scope = $injector.get('$rootScope').$new();
$state = $injector.get('$state');
$httpBackend = $injector.get('$httpBackend');
DTColumnBuilder = $injector.get('DTColumnBuilder');
DTOptionsBuilder = $injector.get('DTOptionsBuilder');
aliasOfYourController = function () {
return $controller('originalNameOfController', {
$scope: scope,
$state: $state,
DTOptionsBuilder: DTOptionsBuilder,
DTColumnBuilder: DTColumnBuilder
});
}
spyOn($state, 'go');
$httpBackend.flush();
});
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
DTOptionsBuilder.fromSource = angular.noop;
DTColumnBuilder.bar = function () { return 'bar'; };
});
间谍的本质是让原始实现发挥作用,但记录所调用的所有函数及相关数据。
Stub
则是带有扩展API的
spy
,您可以完全修改该函数的工作方式,包括返回值、预期参数等等。假设我们使用前面提到的beforeEach块,此时
DTOptionsBuilder.fromSource
将是一个
noop
。因此,安全地在其上进行
spy
并期望已调用该方法。
it('should have been called', function () {
var spy = spyOn(DTOPtionsBuilder, 'fromSource');
aliasOfYourController();
expect(spy).toHaveBeenCalled();
});
如果你想要操作该函数的返回值,我建议使用
sinonjs并将其设置为
stub
。
it('became "foo"', function () {
DTOptionsBuilder.fromSource = sinon.stub().returns('foo');
aliasOfYourController();
expect($scope.dtOptions).toEqual('foo');
});
现在,由于您正在使用promise,所以有点复杂,但是模拟一个基于promise的函数的基础是:
- 将
$q
注入到您的规范文件中。
- 告诉
stub
在已解决的promise的情况下返回$q.when(/** value **/)
。
- 告诉
stub
在被拒绝的promise的情况下返回$q.reject(/** err **/)
。
- 运行
$timeout.flush()
来刷新所有延迟任务。如果您正在模拟http响应,则在单元测试中使用$httpBackend
,并使用$httpBackend.flush()
刷新所有延迟任务。
- 触发
done
回调以通知Jasmine您已完成等待异步任务(可能不需要)。这取决于测试框架/运行器。
它
可能看起来像这样:
it('resolves with "foo"', function (done) {
DTOptionsBuilder.fromSource = sinon.stub().returns($q.when('foo'));
expect($scope.options).to.eventually.become('foo').and.notify(done);
aliasOfYourController();
$timeout.flush();
});
如果你想测试$state.go('toSomeState')
,那么单元测试用例可以是:
it('should redirected successfully', function() {
var stateParams = {
id: 22,
name: sample
}
functionNameInsideWhichItsBeenCalled(stateParams);
expect($state.go).toHaveBeenCalledWith('toSomeState', {
id: stateParams.id,
name: stateParams.name
});
});
现在,很多都只是猜测。没有源代码作为交叉参考,很难建立完全工作的测试套件,但我希望这至少能给你一些使用 $httpBackend、spy 和 stubs 的启示。