我使用Jasmine对一个Angular控制器进行单元测试,该控制器有一个异步运行的方法。我能够成功地将依赖项注入到控制器中,但我不得不改变处理异步的方法,因为我的测试将在数据加载之前运行。我目前正在尝试监视模拟依赖项并使用andCallThrough()
,但导致错误TypeError: undefined is not a function
。
这是我的掌控者......
myApp.controller('myController', function($scope, users) {
$scope.user = {};
users.current.get().then(function(user) {
$scope.user = user;
});
});
和我的test.js ......
describe('myController', function () {
var scope, createController, mockUsers, deferred;
beforeEach(module("myApp"));
beforeEach(inject(function ($rootScope, $controller, $q) {
mockUsers = {
current: {
get: function () {
deferred = $q.defer();
return deferred.promise;
}
}
};
spyOn(mockUsers.current, 'get').andCallThrough();
scope = $rootScope.$new();
createController = function () {
return $controller('myController', {
$scope: scope,
users: mockUsers
});
};
}));
it('should work', function () {
var ctrl = createController();
deferred.resolve('me');
scope.$digest();
expect(mockUsers.current.get).toHaveBeenCalled();
expect(scope.user).toBe('me');
});
});
如果有更好的方法进行此类测试,请告诉我,谢谢。
答案 0 :(得分:4)
尝试
spyOn(mockUsers.current, 'get').and.callThrough();
取决于您使用的版本:在较新版本上,CallThroungh()位于对象内部。 这里是文档http://jasmine.github.io/2.0/introduction.html