Javascript AngularJS-将函数传递给spyOn
因此,我有一个简单的、淡化的应用程序,它返回北约字母表,然后使用模拟和承诺对其进行单元测试 我正在尝试使用Javascript AngularJS-将函数传递给spyOn,javascript,angularjs,unit-testing,Javascript,Angularjs,Unit Testing,因此,我有一个简单的、淡化的应用程序,它返回北约字母表,然后使用模拟和承诺对其进行单元测试 我正在尝试使用main model的.service()中的spyOn函数。在控制器中,我有一个名为natoAlphabet的延迟承诺,它成功地显示在页面上 起初,我从MainController引用getNato,但我从未将MainController.getNato设置为MainModel.getNato 因此,我在主控制器中添加了: this.getNato = MainModel.getNato
main model
的.service()
中的spyOn
函数。在控制器中,我有一个名为natoAlphabet
的延迟承诺,它成功地显示在页面上
起初,我从MainController
引用getNato
,但我从未将MainController.getNato
设置为MainModel.getNato
因此,我在主控制器中添加了:
this.getNato = MainModel.getNato;
我得到的错误是:预期已调用spy getNato。
但是,在控制台日志
中,如果在每个
之前在顶部附近的中对被模拟的控制器执行mockMainCtrl
控制台输出,则会得到对象{name:“Hello World!”,getNato:Promise}
然后在第一个it()
test的下面,输出是Object{name:“Hello World!”}
但是,如果展开该对象,您会得到:
Object {name: "Hello World!"}
getNato: Promise
name: "Hello world!";
__proto__: Object
而在每个
之前的中,您有getNato
我的错误
我的错误发生在Jasmine测试运行时,我从行expect(mockMainCtrl.getNato).toHaveBeenCalled()中得到了Expected spy getNato调用。
代码>在spec.js上
那么我做错了什么
我认为app.js没有任何问题,因为该页面可以成功阅读承诺
附件:
规格js:
describe('Controller: MainCtrl', function() {
beforeEach(module('app'));
var $scope, $q, mockMainCtrl, $controller, scope, deferred;
beforeEach(inject(function($controller, _$rootScope_, _$q_, MainModel) {
$q = _$q_;
$scope = _$rootScope_.$new();
deferred = _$q_.defer();
mockMainCtrl = $controller('MainCtrl', {
$scope: $scope,
MainModel: MainModel
});
console.log(mockMainCtrl);
}));
it('spied and have been called', function() {
spyOn(mockMainCtrl, 'getNato');
console.log(mockMainCtrl);
expect(mockMainCtrl.getNato).toHaveBeenCalled();
});
it('Name from service, instantiated from controller, to be mocked correctly', inject(function() {
expect(mockMainCtrl.name)
.toEqual("Hello World!");
}));
it('Get [getNato] mocked deferred promise', function(mainCtrl) {
deferred.resolve([{ id: 1 }, { id: 2 }]);
$scope.$apply();
expect($scope.results).not.toBe(undefined);
expect($scope.results).toEqual(['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India']);
expect($scope.error).toBe(undefined);
});
});
var app = angular.module('app', []);
app.service('MainModel', function($q) {
this.name = "Hello World!";
var getNato = function() {
var deferred = $q.defer();
var theNatoAlphabet = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India'];
deferred.resolve(theNatoAlphabet);
return deferred.promise;
};
this.getNato = getNato();
});
app.controller('MainCtrl', function($scope, MainModel) {
this.name = MainModel.name;
var self = this;
MainModel.getNato.then(function(data) {
self.natoAlphabet = data;
$scope.results = data;
}).catch(function() {
$scope.error = 'There has been an error!';
});
this.getNato = MainModel.getNato;
});
app.js:
describe('Controller: MainCtrl', function() {
beforeEach(module('app'));
var $scope, $q, mockMainCtrl, $controller, scope, deferred;
beforeEach(inject(function($controller, _$rootScope_, _$q_, MainModel) {
$q = _$q_;
$scope = _$rootScope_.$new();
deferred = _$q_.defer();
mockMainCtrl = $controller('MainCtrl', {
$scope: $scope,
MainModel: MainModel
});
console.log(mockMainCtrl);
}));
it('spied and have been called', function() {
spyOn(mockMainCtrl, 'getNato');
console.log(mockMainCtrl);
expect(mockMainCtrl.getNato).toHaveBeenCalled();
});
it('Name from service, instantiated from controller, to be mocked correctly', inject(function() {
expect(mockMainCtrl.name)
.toEqual("Hello World!");
}));
it('Get [getNato] mocked deferred promise', function(mainCtrl) {
deferred.resolve([{ id: 1 }, { id: 2 }]);
$scope.$apply();
expect($scope.results).not.toBe(undefined);
expect($scope.results).toEqual(['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India']);
expect($scope.error).toBe(undefined);
});
});
var app = angular.module('app', []);
app.service('MainModel', function($q) {
this.name = "Hello World!";
var getNato = function() {
var deferred = $q.defer();
var theNatoAlphabet = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India'];
deferred.resolve(theNatoAlphabet);
return deferred.promise;
};
this.getNato = getNato();
});
app.controller('MainCtrl', function($scope, MainModel) {
this.name = MainModel.name;
var self = this;
MainModel.getNato.then(function(data) {
self.natoAlphabet = data;
$scope.results = data;
}).catch(function() {
$scope.error = 'There has been an error!';
});
this.getNato = MainModel.getNato;
});
看看-
您可能希望“间谍”依赖项,即此处的“MainModel”,并在“$controller”构造之前执行此操作,因为“promise”正在解决控制器构造问题。希望这有帮助
类似于-
beforeEach(inject(function($controller, _$rootScope_, _MainModel_) {
scope = _$rootScope_.$new();
MainModel = _MainModel_;
spyOn(MainModel, 'getNato').andCallThrough();
mockMainCtrl = $controller('MainCtrl', {
$scope: scope
});
}));
it('spied and have been called', function() {
expect(MainModel.getNato).toHaveBeenCalled();
});