7

在我的主要describe我有以下几点:

beforeEach(inject(function(...) {
    var mockCookieService = {
        _cookies: {},
        get: function(key) {
            return this._cookies[key];
        },
        put: function(key, value) {
            this._cookies[key] = value;
        }
    }

   cookieService = mockCookieService;

   mainCtrl = $controller('MainCtrl', {
       ...
       $cookieStore: cookieService
   }
}

稍后我想测试控制器如何相信 cookie 是否已经存在,所以我嵌套了以下描述:

describe('If the cookie already exists', function() {
    beforeEach(function() {
        cookieService.put('myUUID', 'TEST');
    });

    it('Should do not retrieve UUID from server', function() {
        expect(userService.getNewUUID).not.toHaveBeenCalled();
    });
});

但是,当我对其进行更改时,cookieService它并没有持续到正在创建的控制器中。我采取了错误的方法吗?

谢谢!

编辑:更新了测试代码,这就是我使用 $cookieStore 的方式:

var app = angular.module('MyApp', ['UserService', 'ngCookies']);

app.controller('MainCtrl', function ($scope, UserService, $cookieStore) {
var uuid = $cookieStore.get('myUUID');

if (typeof uuid == 'undefined') {
    UserService.getNewUUID().$then(function(response) {
        uuid = response.data.uuid;
        $cookieStore.put('myUUID', uuid);
    });
}

});

4

1 回答 1

1

您的单元测试不必创建一个模拟 $cookieStore 并从本质上重新实现其功能。您可以使用 Jasmine 的spyOn函数来创建间谍对象并返回值。

创建存根对象

var cookieStoreStub = {};

在创建控制器之前设置你的间谍对象

spyOn(cookieStoreStub, 'get').and.returnValue('TEST'); //Valid syntax in Jasmine 2.0+. 1.3 uses andReturnValue()

mainCtrl = $controller('MainCtrl', {
 ... 
 $cookieStore: cookieStoreStub 
}

为 cookie 可用的场景编写单元测试

describe('If the cookie already exists', function() {
    it('Should not retrieve UUID from server', function() {
        console.log(cookieStore.get('myUUID')); //Returns TEST, regardless of 'key'
        expect(userService.getNewUUID).not.toHaveBeenCalled();
    });
});

注意:如果您想测试多个cookieStore.get()场景,您可能希望将控制器的创建移动到块beforeEach()内。describe()这允许您调用spyOn()并返回适合于描述块的值。

于 2015-08-06T13:52:11.963 回答