解决工厂功能内部的承诺

时间:2016-03-22 01:21:15

标签: angularjs unit-testing firebase jasmine

好的,我真的搜索了很多东西来掌握这个问题。但是我在谷歌或StackOverflow上找到的每一个可能的解决方案并没有真正解决我的问题。

我的工厂
我的工厂中有一个函数(find),它使用服务从数据库中检索数据(在我的案例中是Firebase)。成功获取数据后,将检索到的数据分配给变量。

问题
当我在测试套件中调用find时,包含检索数据的变量仍为空。所以我猜这个承诺还没有解决。我不知道如何实现这一点。

我的代码
资源/ user.js的

.factory('User', ['$firebaseRef', function UserFactory($firebaseRef) {

    var ref = $firebaseRef.child('users');

    var User = function(path) {
        this.data = null;
        this.find(path);
    };

    User.prototype.find = function(path) {
        var self = this;

        if (!path) {
            return;
        }

        ref
            .child(path)
            .on('value', function(snapshot) {
                self.data = angular.extend({}, {$id: snapshot.key()}, snapshot.val());
            });
    };

    return User;
}]);

资源/测试/ user.spec.js

describe('resource.user', function() {
    var User, userRef;

    beforeEach(module('firebase'));

    beforeEach(function() {
        module('resource.user')
    });

    beforeEach(inject(function(_User_) {
        User = _User_;
        userRef = new User();

        spyOn(userRef, 'find').and.callThrough();

        userRef.find('some-uuid');
    }));

    it('should resolve the user data when a valid `id` has been given', function() {
        console.log(userRef.data);
        expect(userRef.find).toHaveBeenCalled();
        expect(userRef.data).not.toBeNull(); // This test fails "Expected null not to be null."
    });

});

我在互联网上找到的示例/教程只处理"处理服务承诺内部控制器"。

由于我正在测试服务本身,我无法模拟这些功能(至少这就是我所想的)。

有人能让我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:0)

使用以下方法,$firebaseObject符合承诺。

资源/ user.js的

.factory('User', ['$firebaseRef','$firebaseObject', function UserFactory($firebaseRef,$firebaseObject) {

    var ref = $firebaseRef.child('users');

    var User = {
        find:function(uid){
            if(!uid)
                return;
            return $firebaseObject(ref.child(uid));
        }
    };

    return User;
}]);

资源/测试/ user.spec.js

describe('resource.user', function() {
    var User;

    beforeEach(module('firebase'));

    beforeEach(function() {
        module('resource.user')
    });

    beforeEach(inject(function(_User_) {
        User = _User_;
    }));

    it('should resolve the user data when a valid `id` has been given', function() {
        User.find('some-uuid').then(function(data){
            console.log(data);
            expect(data).not.toBeNull(); 
        });
    });
});