我在被调用由$ mdSidenav,从材料角度提供的服务AngularJS以下控制器。这是服务是由工厂方法提供的。
I have the following controller in AngularJS that is invoking a service provided by "$mdSidenav" from Angular Material. This is service is provided by a factory method.
angular.module('leopDirective', [])
.controller('MenuCtrl', function ($scope,$timeout,$mdSidenav,$log) {
$scope.mdSidenav = $mdSidenav;
$scope.close = function () {
$mdSidenav('left').close().then(function() {$scope.closed=true; });
};
});
我想,以测试我的控制器来嘲笑该服务($ mdSidenav)。以下是茉莉花的测试,我想确定的源$ C $ C:
I am trying to mock that service ($mdSidenav) in order to test my controller. The following is the source code of the Jasmine test that I am trying to define:
describe('Controller: MenuCtrl', function() {
var $rootScope, $scope, $controller, $q, menuCtrl,
mock__mdSidenav = function(component) {
return {
// THIS FUNCTION IS EMPTY SINCE $Q IS NOT AVAILABLE
close: function() {}
}
};
beforeEach(function() {
module('leopDirective', function($provide) {
// I HAVE TO PROVIDE THE MOCK UP BEFORE INJECTING $Q
$provide.value('$mdSidenav', mock__mdSidenav);
});
inject(function($injector) {
$rootScope = $injector.get('$rootScope');
$controller = $injector.get('$controller');
$q = $injector.get('$q');
$scope = $rootScope.$new();
});
menuCtrl = $controller("MenuCtrl", { $scope: $scope });
});
it('should create the $mdSidenav object', function() {
var deferred = $q.defer(),
promise = deferred.promise;
// NOW THAT $Q IS AVAILABLE, I TRY TO FILL UP THE FUNCTION
mock__mdSidenav.close = function() {
return promise.then(function(response){return response.success;});
};
// force `$digest` to resolve/reject deferreds
$rootScope.$digest();
// INVOKE FUNCTION TO TEST
$scope.close();
});
});
这是我的问题是,我不知道如何创建一个函数,该函数返回一个承诺模拟:
The problem that I have is that I do not know how to create a function for the mock that returns a promise:
创建一个承诺依赖于$ Q $ Q必须从块内注入,注入然而,$提供已被模块中使用,只是注入之前,因此,返回我的模拟对象中承诺的功能(mock__mdSidenav()。close()方法),具有在援引$提供和,不知何故,后来创建之前是空的。通过这种方法,那我得到的错误是下面的错误(请参阅演示的 plnkr ),这是告诉我,首先创建空的功能,并填充它以后不工作:
With this approach, the error that I am getting is the following error (see Demo plnkr), which is telling me that creating the empty function first and filling it later does not work:
TypeError: Cannot read property 'then' of undefined
at Scope.$scope.close (app.js:7:35)
什么是嘲笑有一个返回承诺函数的服务的正确方法?
What is the correct way to mock a service that has a function that returns a promise?
首先,让模拟服务方法返回无极对象:
First of all, make mock service method return Promise object:
mock__mdSidenav = function(component) {
return {
isMock: true,
close: function() {
return $q.when();
}
}
};
然后将其注入控制器实例:
Then inject it into controller instance:
menuCtrl = $controller("MenuCtrl", {
$scope: $scope,
$mdSidenav: mock__mdSidenav
});
最后,写一些期望:
And finally, write some expectation:
it('should create the $mdSidenav object', function() {
$scope.close();
$rootScope.$digest();
expect($scope.closed).toBe(true);
});
演示: http://plnkr.co/编辑/ dr79GgZYG2tjiuWU0oFx?p = preVIEW