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();
});
// Stub out the methods of interest.
DTOptionsBuilder.fromSource = angular.noop;
DTColumnBuilder.bar = function () { return 'bar'; };
});
a 的本质spy
是让原始实现做它的事情,但记录对所述函数的所有调用以及各种相关数据。
stub
另一方面,Aspy
具有扩展的 API,您可以在其中完全修改所述功能的工作方式。返回值、预期参数等
假设我们使用了前面提到的 beforeEach 块,此时DTOptionsBuilder.fromSource
将是 a 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
返回。$q.when(/** value **/)
- 在被拒绝的承诺的情况下告诉
stub
返回。$q.reject(/** err **/)
- 运行
$timeout.flush()
以刷新所有延迟任务。如果您在模拟$httpBackend
单元测试中使用的 http 响应并$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); // this is taken from the chai-as-promised library, I'm not sure what the Jasmine equivalent would be (if there is one).
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 和存根的想法。