我有我的控制器$ rootScope。$的功能,监听用户登录
$rootScope.$on('$firebaseSimpleLogin:login',function(e, authUser) {
User.findByUid(authUser.uid).then(function(user) {
我嘲笑 '用户' 和 'login服务' 的服务。
beforeEach(inject(function($controller, $rootScope, $q) {
scope = $rootScope.$new();
q = $q;
headerCtrl = $controller('headerCtrl', {
$scope: scope,
loginService: _loginService,
User: _userService
});
}));
现在我想测试User.findByUid将被调用时,$渔获用户登录。所以我需要知道如何“模拟”这个$ on方法,所以我可以检查findByUid方法是否被调用。怎么样?我想是这样...
it('should call User.findByUid on $firebaseSimpleLogin:login', function() {
spyOn(scope, '$on');
// here I need to probably trigger it somehow...
// and check or?...
expect(scope.$on).toHaveBeenCalled();
});
UPDATE https://gist.github.com/TrkiSF2/39315e7ea980cac6cc9f
SIDE问题
当我改变我CTRL代码:
$rootScope.$on('$firebaseSimpleLogin:login',function(e, authUser) {
User.findByUid(authUser.uid);
});
我的模拟用户服务:
findByUid: function(uid) {
console.log("dump");
}
而我的测试:
it('should call User.findByUid on $firebaseSimpleLogin:login', function() {
spyOn(_userService, 'findByUid');
var authUser = { uid: 1 };
scope.$emit('$firebaseSimpleLogin:login', authUser);
expect(_userService.findByUid).toHaveBeenCalled();
});
它的工作原理......但为什么没有“倾倒”在控制台消息,所以我可以肯定的测试中使用我的嘲笑代码,没有真正的一。 (可以说,我想可以肯定,如果有也不会执行一些DB查询...)
最后一个问题
如果我CTRL代码如下所示:
$rootScope.$on('$firebaseSimpleLogin:login',function(e, authUser) {
User.findByUid(authUser.uid).then(function(user) {
User.setCurrentUser(user);
我想检查是否也调用了User.setCurrentUser?什么是最好的方式来做到这一点?在一些单独的代码或以某种方式相同?
MAYBE回答我的问题?
我出于好奇这是什么会做只是尝试,我增加了新的方法,我的嘲笑用户对象:
setCurrentUser: function(user) {
}
我已经解决了我的承诺:
findByUid: function(uid) {
defered = q.defer();
defered.resolve({nick:'Trki'});
return defered.promise;
},
然后,我更新了我测试
it('should call User.findByUid on $firebaseSimpleLogin:login', function() {
spyOn(_userService, 'findByUid').and.callThrough();
spyOn(_userService, 'setCurrentUser');
var authUser = { uid: 1 };
scope.$emit('$firebaseSimpleLogin:login', authUser);
scope.$root.$digest();
expect(_userService.findByUid).toHaveBeenCalled();
expect(_userService.setCurrentUser).toHaveBeenCalled;
});
它说成功!这是好方法吗?
应该叫User.findByUid上$ firebaseSimpleLogin:登录失败 \t类型错误:“未定义”不是(评估“User.findByUid(authUser.uid)。然后”)的对象,但它有点怪怪的,因为这要求用户.findByUid函数来自控制器而不是来自模拟服务。 – EnchanterIO
当我将您的代码更改为“spyOn(_userService,'findByUid').callThrough();”测试成功。但我有点困惑,为什么... – EnchanterIO
文档。 http://jasmine.github.io/edge/introduction.html#section-Spies:_
and.callThrough
仍然不清楚... – EnchanterIO