0

我正在使用 AngularJS 构建一个应用程序,我现在正在为我的应用程序开发测试用例。假设我有这样的服务;

var app = angular.module('MyApp')
app.factory('SessionService', function () {

    return {
        get: function (key) {
            return sessionStorage.getItem(key);
        },
        set: function (key, val) {
            return sessionStorage.setItem(key, val);
        },
        unset: function (key) {
            return sessionStorage.removeItem(key);
        }
    };
});

我可以像这样为我的服务编写测试用例吗?

beforeEach(module('MyApp'));
    describe('Testing Service : SessionService', function (SessionService) {
        var session, fetchedSession, removeSession, setSession;
        beforeEach(function () {
            SessionService = {
                get: function (key) {
                    return sessionStorage.getItem(key);
                },
                set: function (key, val) {
                    return sessionStorage.setItem(key, val);
                },
                unset: function (key) {
                    return sessionStorage.removeItem(key);
                }
            };
            spyOn(SessionService, 'get').andCallThrough();
            spyOn(SessionService, 'set').andCallThrough();
            spyOn(SessionService, 'unset').andCallThrough();
            setSession     = SessionService.set('authenticated', true);
            fetchedSession = SessionService.get('authenticated');
            removeSession  = SessionService.unset('authenticated');
        });
        describe('SessionService', function () {
            it('tracks that the spy was called', function () {
                expect(SessionService.get).toHaveBeenCalled();
            });
            it('tracks all the arguments used to call the get function', function () {
                expect(SessionService.get).toHaveBeenCalledWith('authenticated');
            });
            //Rest of the Test Cases
        });
    });

我正在使用 Jasmine 的 spy 方法来开发这个测试用例。很好还是我错了?

4

1 回答 1

1

看起来很好。但我认为你会遇到一些问题:

get: function (key) {
        return sessionStorage.getItem(key);
},

你不是在嘲笑 sessionStorage。所以我猜你在尝试从这个对象调用 getItem() 时会出错。您似乎对测试中这些调用的返回值不感兴趣。您只检查是否使用正确的属性调用它们。像这儿:

it('tracks that the spy was called', function () {
   expect(SessionService.get).toHaveBeenCalled();
});

你为什么不改变你的 SessionService 的模拟来返回任何东西?像这样:

get: function (key) {
        return true;
},

如果您想测试您的 getItem/setItem/removeItem 您可以在另一个测试用例中执行此操作

于 2013-08-02T18:42:42.457 回答