依赖和Jasmine测试的功能

时间:2017-02-06 19:56:49

标签: javascript angularjs unit-testing jasmine karma-jasmine

我对AngularJS Service和Jasmine测试有问题。我在另一个服务中使用服务依赖,当我尝试进行单元测试时出现错误:

  

TypeError:undefined不是对象(评估sso.getSession()。userId')

我有一个服务sso,具有获取Session的功能。在会话中,我保存了例如userId和email。

myApp.service('sso', function($rootScope) {
    var session;

    function initSession(){
       ....
       someData = .....;

       session = someData;
    }

    function getSession() {
        return session;
    }
})

我使用sso服务功能的另一个服务(还有userContext - 用userContext我没有任何问题)

myApp.service('adminLogStore', function($http, userContext, sso) {
    var self = this;

    this.saveLog = function(log, userContext.userId) {
        return .........
    }

    var admin = {
        id: sso.getSession().userId,
        email: sso.getSession().userEmail,
        login: sso.getSession().username
    };

    .......
}

最后 - 我的单元测试:

describe('Service count ', function () {
    var $t, $httpBackend, adminLogStore;
    var uid = 5;

    beforeEach(ModuleBuilder.forModules('myapp.common', 'testing.helpers')
        .serviceWithMocksExcept('adminLogStore', '$rootScope', '$http', '$q', '$location')
        .build()
    );

    beforeEach(inject(function (TestingService, _$httpBackend_, _adminLogStore_, userContext, sso) {
        $t = TestingService;
        adminLogStore = _adminLogStore_;
        $httpBackend = _$httpBackend_;
        userContext.userId = uid;
    }));

    it('good value', inject(function () {
        expect(userContext.userId).toBe(5);
    }));
});

我应该如何模拟sso功能?如果我在sso.getSession()之后不使用.userId,我不会收到任何错误。

我尝试在beforeEach中添加mock,就在userContext.userId下,但它不起作用:

var user = {
    userId: 5,
    userEmail: 'test@o2.pl',
    username: 'test'
};
sso = jasmine.createSpyObj('sso', ['getSession']);
sso.getSession = function() {
     return user;
};

---编辑

现在我尝试模拟管理对象而不是模拟sso对象,但没有任何结果。

var user = {
    id: 5,
    email: 'test@o2.pl',
    login: 'test'
};

beforeEach(inject(function (TestingService, _$httpBackend_, _adminLogStore_, userContext) {
    $t = TestingService;
    adminLogStore = _adminLogStore_;
    $httpBackend = _$httpBackend_;
    userContext.userId = uid;
    adminLogStore.admin = user;
}

我改变了我的adminLogStore服务:

this.admin = {
    // id: 12,
    id: sso.getSession().userId,
    email: sso.getSession().userEmail,
    login: sso.getSession().username
};

但我仍然得到同样的错误。

---编辑2

我也尝试像这样模拟sso.getSession(),但它不起作用:

spyOn(sso, "getSession").and.returnValue(user);

1 个答案:

答案 0 :(得分:0)

最后 - 这是我的解决方案。创建mock,并将return user添加为getSession函数:

beforeEach(inject(function (TestingService, _$httpBackend_, _adminLogStore_, userContext, _ssoMock_) {
    $t = TestingService;
    adminLogStore = _adminLogStore_;
    $httpBackend = _$httpBackend_;
    userContext.userId = uid;
    ssoMock = _ssoMock_;
    ssoMock.getSession.and.returnValue(user);
}

当然,必须声明var ssoMock。